Asp.net mvc 3 如何扩展MVC3标签和LabelforHTML帮助程序?

Asp.net mvc 3 如何扩展MVC3标签和LabelforHTML帮助程序?,asp.net-mvc-3,extension-methods,Asp.net Mvc 3,Extension Methods,Html.Label和Html.LabelForhelper方法不像大多数其他helper那样支持htmlAttributes参数。但是,我想设置类。大概是这样的: Html.LabelFor(model => model.Name, new { @class = "control-label" }) 有没有一种简单的方法可以扩展Label/LabelFor而不必复制和扩展这些方法的ILSpy disasm输出?您可以通过创建自己的LabelFor轻松扩展标签: 像这样的东西可以满足你的

Html.Label
Html.LabelFor
helper方法不像大多数其他helper那样支持htmlAttributes参数。但是,我想设置
。大概是这样的:

Html.LabelFor(model => model.Name, new { @class = "control-label" })

有没有一种简单的方法可以扩展Label/LabelFor而不必复制和扩展这些方法的ILSpy disasm输出?

您可以通过创建自己的LabelFor轻松扩展标签:

像这样的东西可以满足你的需要

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, IDictionary<string, object> htmlAttributes)
{
  ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
  string htmlFieldName = ExpressionHelper.GetExpressionText(expression);
  string labelText = metadata.DisplayName ?? metadata.PropertyName ?? htmlFieldName.Split('.').Last();
  if (String.IsNullOrEmpty(labelText))
  {
    return MvcHtmlString.Empty;
  }

  TagBuilder tag = new TagBuilder("label");
  tag.MergeAttributes(htmlAttributes);
  tag.Attributes.Add("for", html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(htmlFieldName));
  tag.SetInnerText(labelText);
  return MvcHtmlString.Create(tag.ToString(TagRenderMode.Normal));
}
或:


我知道,但我试图避免复制反汇编/原始源输出。原始代码由22个方法组成,如果正确地执行此操作,我将不得不覆盖所有方法。否。您只需创建扩展项目并在web.config中插入对项目的调用。抱歉,伙计,我没有说清楚。我已经这样做了(复制MVC源代码并扩展它),但是出于一些原因,我希望避免这样做。我也喜欢保持东西干燥。我希望会有更优雅的东西。对不起,没有任何东西允许你这么做。内置帮助程序不可扩展,并且具有硬编码的属性。如何让编译器在myProject.Helpers.LabelExtensions.LabelFor和'System.Web.Mvc.Html.LabelExtensions.LabelFor(页面上的其他内容需要)之间消除歧义?@Ungaro你找到你的问题的答案了吗?@nicola deep没有。我重写了我的扩展,以引用Lable和lablef,并在我的观点中使用它们。
<pages>
  <namespaces>
    <add namespace="System.Web.Helpers" />
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Routing" />
    <add namespace="System.Web.WebPages" />
    <add namespace="MyProject.Helpers" />   <-- my extension

    ...

 </namespaces>
</pages>
public static class LabelExtensions
{
    public static IHtmlString LabelFor<TModel, TProperty>(
        this HtmlHelper<TModel> htmlHelper,
        Expression<Func<TModel, TProperty>> expression,
        string labelText,
        object htmlAttributes
    )
    {
        var metadata = ModelMetadata.FromLambdaExpression<TModel, TProperty>(expression, htmlHelper.ViewData);
        var htmlFieldName = ExpressionHelper.GetExpressionText(expression);
        return LabelHelper(htmlHelper, metadata, htmlFieldName, labelText, htmlAttributes);
    }

    public static IHtmlString Label(this HtmlHelper htmlHelper, string expression, string labelText, object htmlAttributes)
    {
        var metadata = ModelMetadata.FromStringExpression(expression, htmlHelper.ViewData);
        return LabelHelper(htmlHelper, metadata, expression, labelText, htmlAttributes);
    }

    private static IHtmlString LabelHelper(HtmlHelper html, ModelMetadata metadata, string htmlFieldName, string labelText, object htmlAttributes)
    {
        string str = labelText ?? (metadata.DisplayName ?? (metadata.PropertyName ?? htmlFieldName.Split(new char[] { '.' }).Last<string>()));
        if (string.IsNullOrEmpty(str))
        {
            return MvcHtmlString.Empty;
        }
        TagBuilder tagBuilder = new TagBuilder("label");
        tagBuilder.Attributes.Add("for", TagBuilder.CreateSanitizedId(html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName)));
        var attributes = new RouteValueDictionary(htmlAttributes);
        tagBuilder.MergeAttributes(attributes);
        tagBuilder.SetInnerText(str);
        return new HtmlString(tagBuilder.ToString(TagRenderMode.Normal));
    }
}
@Html.LabelFor(x => x.SomeProperty, null, new { @class = "foo" })
@Html.Label("SomeProperty", null, new { @class = "foo" })