我写了一个扩展方法,也许这可能有所帮助:
public static MvcHtmlString LabelledTextBoxFor<TModel, TResult>(this HtmlHelper<TModel> html, Expression<Func<TModel, TResult>> expression)
{
ExpressionType type = expression.Body.NodeType;
if (type == ExpressionType.MemberAccess)
{
MemberExpression memberExpression = (MemberExpression) expression.Body;
var propName = memberExpression.Member.Name;
var member = memberExpression.Member as PropertyInfo;
var attributes = member.GetCustomAttributes();
StringBuilder sb = new StringBuilder();
foreach (var attribute in attributes)
{
if (attribute is DisplayAttribute)
{
DisplayAttribute d = attribute as DisplayAttribute;
var displayName = d.Name;
sb.Append("<div class=\"form-group\">");
sb.AppendFormat("<label for=\"{0}\">{1}</label>", propName, displayName);
sb.AppendFormat(
"<input type=\"email\" class=\"form-control\" id=\"{0}\" placeholder=\"Enter email\">",
propName);
sb.Append("</div>");
return MvcHtmlString.Create(sb.ToString());
}
}
}
return MvcHtmlString.Create("");
}
您可以使用默认显示属性来指定显示名称。无需定制attributes.And你可以使用这个扩展这样的:
@Html.LabelledTextBoxFor(model => model.EmailAddress)
注:我曾尝试自己和它的正常工作。
更新:更简单的版本
public static MvcHtmlString LabelledTextBoxFor2<TModel, TResult>(this HtmlHelper<TModel> html, Expression<Func<TModel, TResult>> expression)
{
ExpressionType type = expression.Body.NodeType;
if (type == ExpressionType.MemberAccess)
{
var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
var displayName = metadata.DisplayName;
var propName = metadata.PropertyName;
StringBuilder sb = new StringBuilder();
sb.Append("<div class=\"form-group\">");
sb.AppendFormat("<label for=\"{0}\">{1}</label>", propName, displayName);
sb.AppendFormat(
"<input type=\"email\" class=\"form-control\" id=\"{0}\" placeholder=\"Enter email\">",
propName);
sb.Append("</div>");
return MvcHtmlString.Create(sb.ToString());
}
return MvcHtmlString.Create("");
}
你想操纵JavaScript的标签? –
不,我想扩展C#Html帮助程序 – LmC
这个http://msdn.microsoft.com/tr-tr/library/system.componentmodel.dataannotations.displayattribute(v = vs.110)已经有一个显示属性。 aspx –