2012-03-13 103 views
0

我想請用這個語法我自己的HTML輔助方法:什麼是MVC3 HTML輔助方法,這種數據類型?

@Html.BootstrapLabelFor(m => Model.Email) //Email is a simple string property. 

這是我到目前爲止有:

public static MvcHtmlString BootstrapLabelFor<TModel, TValue> 
(this HtmlHelper<TModel> htmlHelper, 
    Expression<Func<TModel, TValue>> expression) 
{ 
    string html = String.Format("<label for='{0}' class='some-class' />", 
     expression.Email.DisplayName???? - NEED HELP HERE.); 
    return new MvcHtmlString(html); 
} 

所以這裏是它的要點。

我需要知道的是如何獲取DisplayName屬性(如果它被稱爲是)從表達式對象之內。假設這是我需要看的地方。

這裏是我LogOnModel類:

public class LogOnModel 
{ 
    [Required(ErrorMessage = "You must enter your email address.")] 
    [Display(Name = "Email:")] 
    public string Email { get; set; } 

    [Required(ErrorMessage = "You must enter your password.")] 
    [DataType(DataType.Password)] 
    [Display(Name = "Password:")] 
    public string Password { get; set; } 

    [Display(Name = "Remember me?")] 
    public bool RememberMe { get; set; } 
} 

現在,我們取得了一些進展。這是我現在擁有的。它的輸出與我想要的正確的屬性,但它不使用顯示名稱元裝飾我在模型中使用。只是吐出屬性名稱。有什麼建議麼?

public static MvcHtmlString BootstrapLabelFor<TModel, TValue> 
    (this HtmlHelper<TModel> htmlHelper, 
     Expression<Func<TModel, TValue>> expression) 
{ 
    string html = String.Format(
     "<label for='{0}' class='control-label'>{0}</label>", 
     ExpressionHelper.GetExpressionText(expression)); 
    return new MvcHtmlString(html); 
} 
+0

我很困惑....應該是'Expresion >'其中'TModel'是你的模型和'TValue'通過投影暗示......正是它說.. 。? – 2012-03-13 20:15:19

回答

1

看一看在ASP.Net MVC 3的源代碼,並複製他們在做什麼,你最終的東西有點像這樣:

public static MvcHtmlString BootstrapLabelFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, 
                  Expression<Func<TModel, TValue>> expression) 
{ 
    var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); 
    var htmlFieldName = ExpressionHelper.GetExpressionText(expression); 
    var 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(htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName))); 
    tag.Attributes.Add("class", "control-label"); 
    tag.SetInnerText(resolvedLabelText); 
    return new MvcHtmlString(tag.ToString(TagRenderMode.Normal)); 
} 

不幸的是,建在幫手的標籤方法不接受htmlAttributes,所以你不能輕鬆地重用他們的代碼這一點。

+0

這是一個偉大的答案!謝謝! – 2012-03-14 14:15:27