2010-04-07 103 views
8

我有以下Asp.net MVC標籤

<label for="Forename">Forename</label> 
<%= Html.TextBoxFor(m => m.Customer.Name.Forename) %> 

的問題是,這是呈現爲

<label for="Forename">Forename</label> 
<input type="text" value="" name="Customer.Name.Forename" id="Customer_Name_Forename"> 

不是我想要的OFC。

我想要一個擴展來正確呈現標籤(即使用for =「」屬性具有輸入id的值),是否有任何MVC 2在我寫自己的擴展之前完成此操作?

回答

13
<%= Html.LabelFor(m => m.Customer.Name.Forename) %> 
<%= Html.TextBoxFor(m => m.Customer.Name.Forename) %> 
11

下面將允許覆蓋默認的顯示名稱,替代使用下面是使用[DisplayName]屬性

使用

<%= Html.LabelFor(m => m.Customer.Name.Forename, "First Name")%> 

代碼

,毀壞你的模型
namespace System.Web.Mvc.Html 
{ 
    public static class LabelExtensions 
    { 
     public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, string displayName) 
     { 
      return LabelHelper(html, ModelMetadata.FromLambdaExpression<TModel, TValue>(expression, html.ViewData), ExpressionHelper.GetExpressionText(expression), displayName); 
     } 

     internal static MvcHtmlString LabelHelper(HtmlHelper html, ModelMetadata metadata, string htmlFieldName, string displayName) 
     { 
      string str = displayName ?? metadata.DisplayName ?? (metadata.PropertyName ?? htmlFieldName.Split(new char[] { '.' }).Last<string>()); 
      if (string.IsNullOrEmpty(str)) 
      { 
       return MvcHtmlString.Empty; 
      } 
      TagBuilder builder = new TagBuilder("label"); 
      builder.Attributes.Add("for", html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(htmlFieldName)); 
      builder.SetInnerText(str); 
      return MvcHtmlString.Create(builder.ToString(TagRenderMode.Normal)); 
     } 
    } 
} 
+0

欣賞代碼s nippet =) – afreeland 2013-10-10 14:43:11

+0

「使用[DisplayName]屬性破壞你的模型」 - 大聲笑 – Alex 2014-11-06 08:39:18

+0

@亞瑟哦,是的,這是一個可怕的想法,我認識的好工作4年半後。 – 2014-11-26 20:29:19