Как получить HTML-идентификатор, сгенерированный asp.net MVC EditorFor - PullRequest
62 голосов
/ 28 января 2011

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

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

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

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

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

Ответы [ 4 ]

136 голосов
/ 28 мая 2013

ASP.NET MVC 4 имеет Html.IdFor () , который может возвращать это:

@Html.IdFor(m => m.User.Surname)
43 голосов
/ 18 августа 2011

См. Этот вопрос: получить сгенерированный клиент для поля формы , это мой ответ:

Я использую этот помощник:

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)

8 голосов
/ 29 января 2011

Я следовал инструкциям ответа 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)%>
7 голосов
/ 28 января 2011

, если вы не создадите свой собственный шаблон Editor.Surname Editor, который вы передадите в некоторые атрибуты HTML, вы не сможете сделать это с EditorFor

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...