我是asp.net mvc的初学者,我有一个疑问:
我正在尝试在我的视图中为TextBox做一个标签,我想知道,我如何获取将在客户端渲染的Id以生成脚本...例如:
<label for="<%=x.Name.ClientId%>"> Name: </label>
<%=Html.TextBoxFor(x=>x.Name) %>
我需要在“ClientId”中放置什么才能确保将正确的ID呈现给相应的控件?
由于
干杯
答案 0 :(得分:38)
将此代码放在某处:
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);
}
}
}
然后在你的ASPX视图中:
<label for="<%= Html.FieldIdFor(m => m.EmailAddress) %>">E-mail address:</label>
<%= Html.TextBoxFor(m => m.EmailAddress) %>
您也可以在JavaScript调用中使用它,因为您不会提前知道控件的ID,并且可能需要它才能使某些JavaScript代码对其起作用:
<script> $.CoolJQueryFunction('<%= Html.FieldIdFor(m => m.EmailAddress) %>'); </script>
LabelFor HTML帮助方法,有人在这里提到,不允许你指定你想要使用的实际文本标签,你必须用属性来装饰你的ViewModels来设置标签文本,恕我直言是丑陋的。我宁愿那些东西出现在实际的ASPX视图部分本身,而不是某些域/视图模型。有些人不同意我的看法。
不确定发布指向某个博客帖子的链接的规则,但我发布了一个关于这个确切主题的博客:http://www.dominicpettifer.co.uk/Blog/37/strongly-typed--label--elements-in-asp-net-mvc-2
答案 1 :(得分:27)
MVC 4现在已经内置了..请参阅this
答案 2 :(得分:5)
它的乐趣可以在MVC的免费源代码中找到。这是答案:
@ Html.IdFor 或 的 @ Html.NameFor 强>
那有什么区别?这是一个问题:
NameFor不会替换任何“。”到“_”。
如果您想要任何示例I have found this cool small article
答案 3 :(得分:0)
如前所述,您不必担心ASP.NET MVC中的ClientID,UniqueID等,因为它们是webforms抽象。您只需写出您想要的ID即可。还有一种扩展方法:
<%= Html.LabelFor(x => x.Name) %>
答案 4 :(得分:-2)
使用以下内容:
Model.Name
您可以简单地执行“查看源代码”或使用类似Firebug的内容检查呈现的文本框,以查看Html.xyzFor()
方法生成的内容。通常,他们会生成一个文本框,其中“id”和“name”属性都设置为属性名称。