自定义 Html.LabelFor

Customizing Html.LabelFor

我想在我的标签中添加一些 类,所以我在 Shared/EditorTemplates 文件夹下添加了 Label.cshtml。 Razor 似乎忽略了它。我也试过 DisplayTemplates文件夹,但也没用。

我可以有标签的编辑器模板吗?如果不是,自定义它们的最佳方式是什么?

Label.cshtml:

@model object

@Html.LabelFor(m => m, new { @class = "col-xs-4 control-label" })

更新:

这是我从 this post and with some changes from this useful link 获取的代码。它仍然不起作用,我不知道发生了什么。有人可以帮忙吗?

public static class Extensions
{
    public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, object htmlAttributes)
    {
        return LabelFor(html, expression, new RouteValueDictionary(htmlAttributes));
    }
    public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
    {
        return LabelFor(html, expression, null);
    }
    public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, IDictionary<string, object> htmlAttributes){

        ModelMetadata metaData = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
        string FieldName = ExpressionHelper.GetExpressionText(expression);
        string LabelText = metaData.DisplayName ?? metaData.PropertyName ?? FieldName.Split('.').Last();
        if (string.IsNullOrEmpty(LabelText))
            return MvcHtmlString.Empty;
        TagBuilder tag = new TagBuilder("label");
        tag.MergeAttributes(htmlAttributes);
        tag.SetInnerText(LabelText);
        tag.Attributes.Add("for", html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(FieldName));
        tag.Attributes.Add("class", "control-label col-xs-2");
        return MvcHtmlString.Create(tag.ToString());
    }
}

EditorTemplate and DisplayTemplate are based on property type. You'd do this by creating your own HTML helper.

public static class LabelExtensions
 {
      public static string Label(this HtmlHelper helper, string target, string text)
      {
           return String.Format("<label for='{0}'>{1}</label>", target, text);

      }
 }

EditorTemplate 是基于 属性 的类型(而不是它们生成的 html 元素)。您需要创建自己的 html 助手

public static MvcHtmlString BootstrapLabelFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression)
{
  var attributes = new { @class = "col-xs-4 control-label" };
  return helper.LabelFor(expression, attributes);
}

并在视图中使用它作为

@Html.BootstrapLabelFor(m => m.yourProperty)

然而,这似乎是一种不灵活的使用助手的方式,只是为了节省在标准 LabelFor() 助手中添加 html 属性。根据 this answer 将关联的文本框和验证消息组合到一个助手中可能更有用(请注意,此答案还显示了如何将命名空间添加到 web.config 文件