C# 属性的客户端Id(ASP.Net MVC)
我正在尝试在我的视图中为一个文本框做一个标签,我想知道,如何获取一个将在客户端渲染以生成脚本的Id。。。例如: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 您可以简单地执行“查看
<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本身,这对我来说是一个奇怪的遗漏。我知道,但有些人不能正确理解(我的英语不是很好)!这就是我所需要的。。。谢谢你,伙计!用属性装饰域模型类对我来说不是一个好的做法,我同意你的看法!见下面我的答案,这不再是必需的