2010-04-07 39 views
8

Tôi đã sauAsp.net MVC Nhãn Đối với

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

vấn đề với điều này là điều này được render như

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

không phải những gì tôi muốn OFC.

Tôi muốn tiện ích mở rộng hiển thị nhãn chính xác (tức là với thuộc tính for = "" có giá trị của id đầu vào), có bất kỳ điều gì trong MVC 2 thực hiện điều này trước khi tôi viết phần mở rộng của riêng mình không?

Trả lời

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

Ý chí sau đây cho phép trọng tên hiển thị mặc định, thay thế cho việc sử dụng dưới đây là để phá hoại mô hình của bạn bằng cách sử dụng thuộc tính [DisplayName]

Cách sử dụng

<%= 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

Đánh giá cao mã nippet =) – afreeland

+0

"phá hoại mô hình của bạn bằng cách sử dụng thuộc tính [DisplayName]" - lol – Alex

+0

@ Alex Oh yeah, đây là một ý tưởng tồi tệ, công việc tốt tôi biết tốt hơn 4 năm rưỡi sau đó. –