Asp.net mvc .NET MVC-如何将类分配给Html.LabelFor?

Asp.net mvc .NET MVC-如何将类分配给Html.LabelFor?,asp.net-mvc,Asp.net Mvc,此代码 <%= Html.LabelFor(model => model.Name) %> model.Name)%%> 产生这个 <label for="Name">Name</label> 名称 但是我想要这个 <label for="Name" class="myLabel">Name</label> 名称 如何做到这一点?好的,看看这个方法的源代码(System.Web.Mvc.Html.LabelExtens

此代码

<%= Html.LabelFor(model => model.Name) %>
model.Name)%%>
产生这个

<label for="Name">Name</label>
名称
但是我想要这个

<label for="Name" class="myLabel">Name</label>
名称

如何做到这一点?

好的,看看这个方法的源代码(System.Web.Mvc.Html.LabelExtensions.cs),在ASP.NET Mvc 2中似乎没有一种使用HtmlHelper来实现这一点的方法。我认为您最好的选择是创建自己的HtmlHelper,或者为此特定标签执行以下操作:

<label for="Name" class="myLabel"><%= Model.Name %></label>

标签过载:

public static class NewLabelExtensions
{
    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));
    }
}
公共静态类NewLabelExtensions
{
公共静态MvcHtmlString LabelFor(此HtmlHelper html、表达式、对象htmlAttributes)
{
返回LabelFor(html、表达式、新RouteValueDictionary(htmlAttributes));
}
公共静态MvcHtmlString LabelFor(此HtmlHelper html、表达式、IDictionary htmlAttributes)
{
ModelMetadata=ModelMetadata.FromLambdaExpression(表达式,html.ViewData);
字符串htmlFieldName=ExpressionHelper.GetExpressionText(表达式);
字符串labelText=metadata.DisplayName??metadata.PropertyName??htmlFieldName.Split('.').Last();
if(String.IsNullOrEmpty(labelText))
{
返回MvcHtmlString.Empty;
}
标记生成器标记=新标记生成器(“标签”);
合并属性(htmlAttributes);
tag.Attributes.Add(“for”,html.ViewContext.ViewData.TemplateInfo.getFullHtmlFieldDid(htmlFieldName));
tag.SetInnerText(labelText);
返回MvcHtmlString.Create(tag.ToString(TagRenderMode.Normal));
}
}

遗憾的是,在Html中,LabelFor()方法没有允许直接类声明的方法签名。但是,添加了2个重载,它们接受htmlAttributes匿名对象

与所有HTMLHelper一样,重要的是要记住,C#编译器将
class
视为保留字

因此,如果使用@before-the-class属性,它可以解决问题,即:

@Html.LabelFor(model => model.PhysicalPostcode, new { @class= "SmallInput" })

@符号使“类”成为传递的文本。

它不工作对象引用未设置为对象实例。但这可能是另一个错误。我对MVC还是个新手。所以没有办法将css类放入Html.LabelFor,好的,谢谢Richard!按照Richard的建议,只需创建自己的HtmlHelper重载LabelFor()。如果您不确定如何构建表达式签名,可以复制LabelFor()源代码的语法。嗨,Nathan,您如何为LabelFor创建重载?或者我可以从哪里复制它?您可以将其作为新答案发布,谢谢。仅供参考,我知道为什么Model.Name不起作用。这是因为我添加了一个新项目,所以模型(项目)仍然是空的。就像Nathan Taylor所说的,对于Aximili来说,为什么这不是更高的投票率?它工作得很好!(至少在MVC4中)我试过在MVC3中,它似乎不喜欢它…也许是MVC4FTW!这正是我要找的。我使用的是MVC4,顺便说一句:)也许编辑这个问题/答案可以表明MVC4解决了这个问题。这个语法也适用于Razor网页中的
@Html.Label
帮助程序。