2011-06-06 64 views
15

可能重複:
Client Id for Property (ASP.Net MVC)如何指定ID爲Html.LabelFor <>(MVC剃刀)

有沒有一種方法,使刀片渲染ID屬性的標籤元素時使用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> 

僅供參考 - 我想要的ID添加到標籤的唯一理由就是對CSS的設計。我更喜歡用ID來引用標籤,而不是將標籤包裝在一個塊(即div)中,然後對塊進行造型。

+0

爲什麼你需要做的M => m.Foo爲什麼不m.Foo – Nikos 2012-04-17 14:45:13

+0

因爲您必須插入一個可以讀取而不是插入值的表達式。 – 2016-01-19 09:12:56

回答

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)); 
    } 
} 

,一旦納入範圍在您的視圖中使用這個助手,因爲現在它由您來管理HTML ID,確保它們在整個文檔中都是唯一的。

備註2:我無恥地抄襲並修改了ASP.NET MVC 3源代碼中的LabelHelper方法。

+0

很好的答案,謝謝你在這做這件事。 – camainc 2011-09-20 20:13:07

+1

在沒有擴展名的最新版MVC中支持此方法。 – Todd 2013-11-17 22:09:53

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)); 
}