2011-06-06 12 views
15

संभव डुप्लिकेट के लिए आईडी निर्दिष्ट करने के लिए कैसे:
Client Id for Property (ASP.Net MVC)एक Html.LabelFor <> (MVC उस्तरा)

वहाँ उस्तरा एक लेबल के लिए एक आईडी विशेषता प्रस्तुत करना बनाने के लिए एक रास्ता है तत्व का उपयोग करते समय Html.LabelFor <> सहायक?

उदाहरण:

.cshtml page 
@using (Html.BeginForm()) 
{ 
@Html.LabelFor(m => m.Foo) 
@Html.TextBoxFor(m => m.Foo) 
} 

गाया पेज

<form ...> 
<label for="Foo" id="Label_Foo" /> 
<input type="text" name="Foo" id="Foo" /> 
</form> 

FYI करें - एकमात्र कारण मैं लेबल के लिए एक आईडी जोड़ने के लिए इच्छुक हूँ सीएसएस डिजाइन के लिए है। मैं लेबल को ब्लॉक (यानी div) के भीतर लेबल को लपेटने के बजाय लेबल को संदर्भित करना चाहता हूं और फिर ब्लॉक को स्टाइल करना चाहता हूं।

+0

कारण है कि आप क्या करने के लिए मीटर => m.Foo क्यों सिर्फ m.Foo नहीं है के लिए – Nikos

+0

क्योंकि आपको एक अभिव्यक्ति डालना है जिसे मूल्य डालने के बजाय पढ़ा जा सकता है। –

उत्तर

26

दुर्भाग्य से इस सहायक का कोई अंतर्निहित अधिभार नहीं है जो आपको इसे प्राप्त करने की अनुमति देता है।

सौभाग्य से यह कोड की लाइनें लग लागू करने के लिए अपने निजी:

@Html.LabelFor(m => m.Foo, new { id = "Foo" }) 
@Html.TextBoxFor(m => m.Foo) 

टिप्पणी:

public static class LabelExtensions 
{ 
    public static MvcHtmlString LabelFor<TModel, TValue>(
     this HtmlHelper<TModel> html, 
     Expression<Func<TModel, TValue>> expression, 
     object htmlAttributes 
    ) 
    { 
     return LabelHelper(
      html, 
      ModelMetadata.FromLambdaExpression(expression, html.ViewData), 
      ExpressionHelper.GetExpressionText(expression), 
      htmlAttributes 
     ); 
    } 

    private static MvcHtmlString LabelHelper(
     HtmlHelper html, 
     ModelMetadata metadata, 
     string htmlFieldName, 
     object htmlAttributes 
    ) 
    { 
     string resolvedLabelText = metadata.DisplayName ?? metadata.PropertyName ?? htmlFieldName.Split('.').Last(); 
     if (string.IsNullOrEmpty(resolvedLabelText)) 
     { 
      return MvcHtmlString.Empty; 
     } 

     TagBuilder tag = new TagBuilder("label"); 
     tag.Attributes.Add("for", TagBuilder.CreateSanitizedId(html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName))); 
     tag.MergeAttributes(new RouteValueDictionary(htmlAttributes)); 
     tag.SetInnerText(resolvedLabelText); 
     return MvcHtmlString.Create(tag.ToString(TagRenderMode.Normal)); 
    } 
} 

और एक बार गुंजाइश में लाया अपने ध्यान में रखते हुए इस सहायक का उपयोग अब यह क्योंकि एचटीएमएल आईडी प्रबंधित करने के लिए आप पर निर्भर है, सुनिश्चित करें कि वे पूरे दस्तावेज़ में अद्वितीय हैं।

टिप्पणी 2: मैंने एएसपी.नेट एमवीसी 3 स्रोत कोड से LabelHelper विधि को बेकार ढंग से चोरी और संशोधित किया है।

+0

अच्छा जवाब, इस पर लेगवर्क करने के लिए धन्यवाद। – camainc

+1

यह विधि एक्सटेंशन के बिना एमवीसी के नवीनतम संस्करणों में समर्थित है। – Todd

1

और सामान्य लेबल @Html.Label()

आपको लगता है कि और आसान एक लाइन कोड कर सकते हैं ...

public static HtmlString Label(this HtmlHelper helper, string target = "", string text = "", string id = "") 
{ 
    return new HtmlString(string.Format("<label id='{0}' for='{1}'>{2}</label>", id, target, text)); 
} 
संबंधित मुद्दे