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);
}
看看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
,因此您无法轻松地为此重用它们的代码。