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

64

我使用HTML Helpers来渲染我的字段:

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

输出结果可能会像这样:

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

该辅助程序使用className + '.' + fieldName来构建id。
我需要将id传递给一个jQuery函数,有没有一种方法可以不硬编码它?
也许有一个辅助程序可以使用ASP.NET MVC2惯例来实现?

4个回答

143

ASP.NET MVC 4内置了Html.IdFor(),可以返回以下内容:

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

44

看这个问题:获取表单字段的生成客户端ID,这是我的回答:

我使用这个帮助程序:

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)));
    }
}

使用它的方式和其他helper一样:@Html.ClientIdFor(model=>model.client.email)


13
根据我的回答,现在在ASP.NET 4中已经内置了Html.IdFor()函数。 - bkaid
1
非常感谢,我需要这个。因为我正在制作自定义帮助器,所以html.IdFor()对我没有帮助。 - CMS

9

我按照Mac的回答这里的说明进行了操作,并构建了自己的自定义扩展:

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)%>

值得注意的是,您需要使用“using System.Linq.Expressions;”才能使其正常工作。无论如何,代码很棒 :) - James McCormack
我认为如果你正在引用数组元素,你也需要替换 '[' 和 ']'。 - Nadav

7

如果您不创建自己的User.Surname EditorTemplate,并传递一些HTML属性,您将无法使用EditorFor实现此目的。

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

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

在使用jQuery选择器检索此元素时,您可以通过使用一些以某些字符结尾的选择器来实现而无需硬编码。使用这种方式,您可能仍然可以使用EditorFor并只需使用$("[id^='Surname]")`进行选择。如果您正在尝试选择此特定元素,则在您的jQuery代码中几乎没有不硬编码的方法。


添加HTML属性是最简单的方法。比编写自己的扩展方法容易得多。 - Tim P.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接