2012-03-27 13 views
11

Html.Label ve Html.LabelFor yardımcı yöntemler, diğer yardımcıların çoğu gibi htmlAttributes parametresini desteklemez. Ancak class'u ayarlamak istiyorum. Böyle bir şey:MVC3 Label ve LabelFor HTML yardımcıları nasıl genişletilir?

Html.LabelFor(model => model.Name, new { @class = "control-label" }) 

kopyalama başvurmadan ve bu yöntemlerin ILSpy disasm çıkışını uzanan olmadan Etiket/LabelFor uzanan bir kolay yolu var mı? ,

böyle

Bir şey

public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, object htmlAttributes) 
{ 
    return LabelFor(html, expression, new RouteValueDictionary(htmlAttributes)); 
} 

public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, IDictionary<string, object> htmlAttributes) 
{ 
    ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData); 
    string htmlFieldName = ExpressionHelper.GetExpressionText(expression); 
    string labelText = metadata.DisplayName ?? metadata.PropertyName ?? htmlFieldName.Split('.').Last(); 
    if (String.IsNullOrEmpty(labelText)) 
    { 
    return MvcHtmlString.Empty; 
    } 

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

Güncelleme sadece proje oluşturulan uzatma yöntemi kullanmak için gerekenleri yapmalıdır:

cevap

25

Kolayca kendi LabelFor oluşturarak etiketi uzatabilirsiniz senin Views\web.config

<pages> 
    <namespaces> 
    <add namespace="System.Web.Helpers" /> 
    <add namespace="System.Web.Mvc" /> 
    <add namespace="System.Web.Mvc.Ajax" /> 
    <add namespace="System.Web.Mvc.Html" /> 
    <add namespace="System.Web.Routing" /> 
    <add namespace="System.Web.WebPages" /> 
    <add namespace="MyProject.Helpers" /> <-- my extension 

    ... 

</namespaces> 
</pages> 
+0

Biliyorum ama ben sökülüp/orijinal kaynak çıkışını kopyalayan önlemek çalışıyorum. Orijinal kod 22 yöntemden oluşuyor, bunu doğru bir şekilde yapmak için hepsini geçersiz kılmalıyım. – batkuip

+2

no. sadece uzantı projenizi oluşturup projenize çağrılarınızı web.config dosyanıza eklersiniz. – Iridio

6
bu satırı ekleyin 10

ve sonra:

@Html.LabelFor(x => x.SomeProperty, null, new { @class = "foo" }) 

ya:

@Html.Label("SomeProperty", null, new { @class = "foo" }) 
+0

Üzgünüm, kendimi netleştirmediysem. Bunu yaptım (MVC kaynağını kopyalamak ve genişletmek), ancak birkaç nedenden dolayı kaçınmak istediğim bir şey. Ayrıca DRY şeyler tutmak isterim. Daha zarif bir şey olacağını umuyordum. – batkuip

+1

Üzgünüz, bunu yapmanıza izin veren hiçbir şey yok. Yerleşik yardımcı, genişletilemez ve sabit kodlanmış özelliklere sahiptir. –

+0

Derleyiciyi myProject.Helpers.LabelExtensions.LabelFor ve 'System.Web.Mvc.Html.LabelExtensions.LabelFor (sayfadaki diğer öğeler için gerekli) arasında nasıl ayrıştırabilirim? – Ungaro