我正在尝试学习如何制作强类型的Html助手。我尝试了几个网站,我发现代码项目的网站Custom Strongly-typed HtmlHelpers in ASP.NET MVC和代码网站的颂歌Why All The Lambdas?非常有用。
我几乎从代码项目中复制粘贴代码并稍微改变了一下。我尝试制作一个自定义的html助手,它将遵循Bootstrap样式:BootstrapTextBoxFor()
- 下面的代码。它应该呈现带有标签的文本框。由于某些原因,Metadata.Model
为空,我无法获取属性名称。我的意思是我希望获得[Display]
属性中指定的值。例如
[Display("User Name")]
public string username { get; set; }
代码
public static MvcHtmlString BootstrapTextBox(this HtmlHelper htmlHelper, string name, string value, string type = "text", int labelCol = 2, int editorCol = 6)
{
StringBuilder tags = new StringBuilder(); //.Append(Environment.NewLine);
tags.AppendLine(@"<div class=""form-group"">");
tags.AppendFormat(@"<label class=""col-md-{0}"" for=""{1}"">{2}</label>", labelCol, name, value).Append(Environment.NewLine);
tags.AppendFormat(@"<div class=""col-md-{0}"">", editorCol).Append(Environment.NewLine);
tags.AppendLine(@"<div class=""input-group"">");
tags.AppendFormat(@"<input type=""{0}"" class=""form-control"" id=""{1}"" />", type, name);
tags.AppendLine(@"</div>");
tags.AppendLine(@"</div>");
tags.AppendLine(@"</div>");
return MvcHtmlString.Create(tags.ToString());
}
public static MvcHtmlString BootstrapTextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
{
string name = ExpressionHelper.GetExpressionText(expression);
var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
return BootstrapTextBox(htmlHelper, name, metadata.Model as string);
}