如何获取由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)%>