Asp.net mvc 2 如何添加一个“quot;id";ASP.NET MVC2中Html.LabelFor()的属性?

Asp.net mvc 2 如何添加一个“quot;id";ASP.NET MVC2中Html.LabelFor()的属性?,asp.net-mvc-2,html-helper,Asp.net Mvc 2,Html Helper,如何向ASP.NET MVC2中的Html.LabelFor()添加“id”属性 这是我的标签代码: <%=Html.LabelFor(x => x.FirstName)%> x.FirstName)%%> 这是我失败的尝试: <%=Html.LabelFor(x => x.FirstName, new { @id = "first-name" } )%> x.FirstName,新的{@id=“first name”})%> 谢谢。LabelFor、

如何向ASP.NET MVC2中的Html.LabelFor()添加“id”属性

这是我的标签代码:

<%=Html.LabelFor(x => x.FirstName)%>
x.FirstName)%%>
这是我失败的尝试:

<%=Html.LabelFor(x => x.FirstName, new { @id = "first-name" } )%>
x.FirstName,新的{@id=“first name”})%>

谢谢。

LabelFor、TextBoxFor、XXXFor方法会根据属性名称自动添加id。我认为你无法推翻这一点。如果你想设置id,你需要使用“non-For”方法,比如Html.TextBox。

这个扩展方法怎么样

public static class LabelExtensions

    {
        public static string Label(this HtmlHelper helper, string target, string id, string text)
        {
            return String.Format("<label for='{0}' id='{1}'>{2}</label>", target,id, text);
        }
    }
公共静态类标签扩展
{
公共静态字符串标签(此HtmlHelper帮助程序、字符串目标、字符串id、字符串文本)
{
返回String.Format(“{2}”,目标,id,文本);
}
}
编辑


我认为更好的方法是使用与类似的tagbuilder,并使用MergeAttribute函数来包含id。

这里有一个帮助器,它可以完成您需要的工作:

public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, string id)
{
    ModelMetadata meta = ModelMetadata.FromLambdaExpression(expression, html.ViewData), 
    string 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.Attributes.Add("for", html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(htmlFieldName));
    tag.MergeAttribute("id", id);
    tag.SetInnerText(labelText);
    return tag.ToMvcHtmlString(TagRenderMode.Normal);
}
publicstaticmvchtmlstringlabelfor(此htmlhelp-html,表达式,字符串id)
{
ModelMetadata meta=ModelMetadata.FromLambdaExpression(表达式,html.ViewData),
字符串ExpressionHelper.GetExpressionText(表达式)
字符串labelText=metadata.DisplayName??metadata.PropertyName??htmlFieldName.Split('.').Last();
if(String.IsNullOrEmpty(labelText)){
返回MvcHtmlString.Empty;
}
标记生成器标记=新标记生成器(“标签”);
tag.Attributes.Add(“for”,html.ViewContext.ViewData.TemplateInfo.getFullHtmlFieldDid(htmlFieldName));
tag.MergeAttribute(“id”,id);
tag.SetInnerText(labelText);
返回tag.ToMvcHtmlString(TagRenderMode.Normal);
}

asp.net mvc源代码中LabelFor helper的一个简单修改。

也许行为自MVC2以来发生了变化,因为尽管我使用的是Razor和VB.net,但我使用的是这段代码,它应该与您在
id
之前输入的
@
大致相同(我现在使用的是MVC4):

这将生成以下HTML:

<label for="ItemNumber" id="ItemNumberL">ItemNumber</label>
ItemNumber

实际上,我认为LabelFor根本没有添加id——该id可能会应用于与标签关联的输入字段。我认为您是对的,您需要使用非强类型版本来添加HTML属性。
<label for="ItemNumber" id="ItemNumberL">ItemNumber</label>