Как получить идентификатор HTML, созданный asp.net MVC EditorFor

Я использую HTML-помощники для отображения моих полей:

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

и результат будет примерно таким:

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

Помощник использует классName + '.' è fieldName для создания идентификатора.
Мне нужно передать id функции jQuery. Есть ли способ сделать это без жесткого кодирования? Может быть, помощник, который может использовать соглашения ASP.NET MVC2?

Ответ 1

Я выполнил инструкции Mac answer здесь, и я создал собственное собственное расширение:

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

Ответ 2

В ASP.NET MVC 4 встроен Html.IdFor(), который может вернуть это:

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

Ответ 3

Посмотрите на этот вопрос: получите сгенерированный 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)

Ответ 4

если вы не создали свой собственный User.Surname EditorTemplate, который вы передаете в некоторых атрибутах HTML, вы не сможете сделать это с помощью EditorFor

Однако вы можете использовать TextBoxFor и установить id

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

По вопросу получения этого элемента с помощью селектора jQuery вы можете достичь этого без необходимости жесткого кода, используя некоторые из end-with selector. Используя это, вы, вероятно, все еще можете использовать EditorFor и просто выберите его с помощью $("[id^='Surname] ")`. Если вы пытаетесь выбрать этот конкретный элемент, на самом деле нет способа НЕ ЖЕСТКОЙ ЧТО-ТО ЧТО-НИБУДЬ в коде jQuery.