如何获取由asp.net MVC EditorFor生成的HTML标识

我使用HTML助手呈现我的领域:

<%=Html.EditorFor(m => m.User.Surname)%> 

和输出将是这样的:

 <input class="text-box single-line" id="User_Surname" name="User.Surname" type="text" value="" /> 

助手使用className +'。' èfieldName构buildid。
我需要将id传递给一个jQuery函数。 有没有办法让它没有硬编码? 也许可以使用ASP.NET MVC2约定的帮手?

ASP.NET MVC 4有内置的Html.IdFor()可以返回这个:

 @Html.IdFor(m => m.User.Surname) 

看到这个问题: 获得一个表单字段生成的clientid ,这是我的答案:

我使用这个帮手:

 public static partial class HtmlExtensions { public static MvcHtmlString ClientIdFor<TModel, TProperty>( this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) { return MvcHtmlString.Create( htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId( ExpressionHelper.GetExpressionText(expression))); } } 

像使用其他任何助手一样使用它: @Html.ClientIdFor(model=>model.client.email)

除非你创build你自己的User.Surname EditorTemplate,你传递了一些HTML属性,你将无法使用EditorFor

但是,您可以使用TextBoxFor并设置ID

 <%= Html.TextBoxFor(m => m.User.Surname, new { id = "myNewId" })%> 

关于用jQueryselect器检索这个元素的主题,你可以实现这一点,而不必通过使用一些select器来结束硬编码。 使用它,你可能仍然可以使用EditorFor ,只需用$("[id^='Surname ]”)select它。 如果你正在尝试select这个特定的元素,那么真的没有办法在你的jQuery代码中硬编码SOMETHING。

我已经按照Mac的答案在这里的指示,我已经build立了我自己的自定义扩展:

 public static class HtmlHelperExtensions { public static string HtmlIdNameFor<TModel, TValue>( this HtmlHelper<TModel> htmlHelper, System.Linq.Expressions.Expression<Func<TModel, TValue>> expression) { return (GetHtmlIdNameFor(expression)); } private static string GetHtmlIdNameFor<TModel, TValue>(Expression<Func<TModel, TValue>> expression) { if (expression.Body.NodeType == ExpressionType.Call) { var methodCallExpression = (MethodCallExpression)expression.Body; string name = GetHtmlIdNameFor(methodCallExpression); return name.Substring(expression.Parameters[0].Name.Length + 1).Replace('.', '_'); } return expression.Body.ToString().Substring(expression.Parameters[0].Name.Length + 1).Replace('.', '_'); } private static string GetHtmlIdNameFor(MethodCallExpression expression) { var methodCallExpression = expression.Object as MethodCallExpression; if (methodCallExpression != null) { return GetHtmlIdNameFor(methodCallExpression); } return expression.Object.ToString(); } } 

我已经导入了我的应用程序的名称空间

 <%@ Import Namespace="MvcApplication2" %> 

最后我可以像这样使用我的代码:

 <%=Html.HtmlIdNameFor(m=>m.Customer.Name)%>