MVC3 html助手方法中的这种数据类型是什么

本文关键字:数据类型 是什么 html 方法 MVC3 | 更新日期: 2023-09-27 18:27:53

我正试图用以下语法创建我自己的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; }
}

现在我们正在取得进展。这是我现在拥有的。它输出了我想要的正确属性,但没有使用我在模型中使用的DisplayName元数据装饰器。只是吐出了房产名称。有什么建议吗?

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

MVC3 html助手方法中的这种数据类型是什么

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

不幸的是,Labels的内置助手方法不接受htmlAttributes,因此您无法轻松地为此重用它们的代码。