C# 属性的客户端Id(ASP.Net MVC)

C# 属性的客户端Id(ASP.Net MVC),c#,asp.net-mvc,razor,clientid,C#,Asp.net Mvc,Razor,Clientid,我正在尝试在我的视图中为一个文本框做一个标签,我想知道,如何获取一个将在客户端渲染以生成脚本的Id。。。例如: <label for="<%=x.Name.ClientId%>"> Name: </label> <%=Html.TextBoxFor(x=>x.Name) %> 名称: x、 名称)%%> 我需要在“ClientId”中输入什么来确保将正确的Id呈现给相应的控件?使用以下命令: Model.Name 您可以简单地执行“查看

我正在尝试在我的视图中为一个文本框做一个标签,我想知道,如何获取一个将在客户端渲染以生成脚本的Id。。。例如:

<label for="<%=x.Name.ClientId%>"> Name: </label>
<%=Html.TextBoxFor(x=>x.Name) %>
名称:
x、 名称)%%>
我需要在“ClientId”中输入什么来确保将正确的Id呈现给相应的控件?

使用以下命令:

Model.Name

您可以简单地执行“查看源代码”或使用类似Firebug的方法检查呈现的文本框,以查看
Html.xyzFor()
方法生成的内容。通常,它们会生成一个文本框,其中“id”和“name”属性都设置为属性名。

正如前面所说,在ASP.NET MVC中,您不需要担心ClientID、UniqueID等,因为它们是webforms抽象。你可以简单地写出你想要的ID。还有一种扩展方法:

<%= Html.LabelFor(x => x.Name) %>
x.Name)%%>

将此代码放在某个地方:

using System; 
using System.Linq.Expressions; 
using System.Web.Mvc; 

namespace MvcLibrary.Extensions 
{ 
    public static class HtmlExtensions 
    { 
        public static MvcHtmlString FieldIdFor<TModel, TValue>(this HtmlHelper<TModel> html,
            Expression<Func<TModel, TValue>> expression) 
        { 
            string htmlFieldName = ExpressionHelper.GetExpressionText(expression); 
            string inputFieldId = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(htmlFieldName); 
            return MvcHtmlString.Create(inputFieldId); 
        } 
    } 
}
使用系统;
使用System.Linq.Expressions;
使用System.Web.Mvc;
命名空间MvcLibrary.Extensions
{ 
公共静态类
{ 
公共静态MvcHtmlString字段IDFOR(此HtmlHelper html,
表达式(表达式)
{ 
字符串htmlFieldName=ExpressionHelper.GetExpressionText(表达式);
字符串inputFieldId=html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(htmlFieldName);
返回MvcHtmlString.Create(inputFieldId);
} 
} 
}
然后在您的ASPX视图中:

<label for="<%= Html.FieldIdFor(m => m.EmailAddress) %>">E-mail address:</label> 
<%= Html.TextBoxFor(m => m.EmailAddress) %>
电子邮件地址:
m、 电子邮件地址)%>
您也可以在JavaScript调用中使用它,因为您事先不知道控件的ID,并且可能需要它来让某些JavaScript代码针对它工作:

<script> $.CoolJQueryFunction('<%= Html.FieldIdFor(m => m.EmailAddress) %>'); </script>
$.CoolJQueryFunction('m.EmailAddress)%>');
这里提到的LabelFor HTML helper方法不允许您指定要使用的实际文本标签,您必须使用属性装饰ViewModels以设置标签文本,因为IMHO很难看。我宁愿这些东西出现在实际的ASPX视图部分本身,而不是某些域/视图模型上。不过,有些人会不同意我的观点


我不确定发布博客文章链接的规则,但我发布了一篇关于这个主题的博客:

MVC4现在内置了这个。。请参见

在MVC的免费源代码中找到的有趣内容。答案如下:

@Html.IdFor@Html.NameFor

那么有什么区别呢?这里是一个陷阱:

的名称不会将任何“.”替换为“\


如果您需要任何示例,

它将写入属性的内容,而我不需要它。。在使用
Html.LabelFor(x=>x.Id)
时,我需要属性的名称(或客户端Id…如果有…,我当然不知道)@FelipeOriani@womp,它显示的是我定义的Id的“Id”文本,而不是来自DB的Id值。有什么评论吗?LabelFor会给你一个强类型的标签,但不允许你指定实际的标签文本本身,你必须将它作为属性属性设置为ViewModel本身,这对我来说是一个奇怪的遗漏。我知道,但有些人不能正确理解(我的英语不是很好)!这就是我所需要的。。。谢谢你,伙计!用属性装饰域模型类对我来说不是一个好的做法,我同意你的看法!见下面我的答案,这不再是必需的