我使用HTML助手来呈现我的字段:
m.User.Surname)%>
输出将是这样的:
name="User.Surname" type="text" value="" />
助手使用className +'。 èfieldName生成ID。
我需要将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(
this HtmlHelper htmlHelper,
Expression> expression)
{
return MvcHtmlString.Create(
htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(
ExpressionHelper.GetExpressionText(expression)));
}
}
就像使用其他任何助手一样使用它:@Html.ClientIdFor(model=>model.client.email)
根据我的回答,现在已使用Html.IdFor()将其内置到ASP.NET 4中
非常感谢,我需要那个。 html.IdFor()并没有帮助我,因为我正在制作自定义帮助程序,
我已按照Mac的回答说明进行操作,并构建了自己的自定义扩展程序:
public static class HtmlHelperExtensions
{
public static string HtmlIdNameFor(
this HtmlHelper htmlHelper,
System.Linq.Expressions.Expression> expression)
{
return (GetHtmlIdNameFor(expression));
}
private static string GetHtmlIdNameFor(Expression> 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();
}
}
我已经导入了我的应用程序的名称空间
最后,我可以这样使用我的代码:
m.Customer.Name)%>
值得注意的是,您需要使用System.Linq.Expressions;。 为此工作。 仍然是甜蜜的代码:)
我认为您还需要替换[&](如果您引用数组元素)
除非您创建自己的User.Surname EditorTemplate,并在其中传递一些HTML属性,否则您将无法使用EditorFor
但是,您可以使用TextBoxFor并设置ID
m.User.Surname, new { id ="myNewId" })%>
关于使用jQuery选择器检索此元素的主题,您可以通过使用一些end-with选择器来实现此目的而不必进行硬编码。使用它,您可能仍会使用EditorFor并仅通过$("[id^='Surname]")选择它。如果您尝试选择此特定元素,则实际上没有办法在您的jQuery代码中不进行硬编码。
添加HTML属性是最简单的方法。 比编写自己的扩展方法要容易得多