Идентификатор клиента для свойства (ASP.Net MVC)

Я пытаюсь сделать метку для TextBox в своем представлении, и я хотел бы знать, как я могу взять идентификатор, который будет отображаться в клиенте для создания сценариев... например:

<label for="<%=x.Name.ClientId%>"> Name: </label>
<%=Html.TextBoxFor(x=>x.Name) %>

Что мне нужно указать в «ClientId», чтобы убедиться, что правильный идентификатор будет отображаться для соответствующего элемента управления?


person Felipe Oriani    schedule 17.06.2010    source источник


Ответы (5)


Поместите этот код куда-нибудь:

using System; 
using System.Linq.Expressions; 
using System.Web.Mvc; 

namespace MvcLibrary.Extensions 
{ 
    public static class HtmlExtensions 
    { 
        public static MvcHtmlString FieldIdFor<TModel, TValue>(this HtmlHelper<TModel> html,
            Expression<Func<TModel, TValue>> expression) 
        { 
            string htmlFieldName = ExpressionHelper.GetExpressionText(expression); 
            string inputFieldId = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(htmlFieldName); 
            return MvcHtmlString.Create(inputFieldId); 
        } 
    } 
}

Затем в представлении ASPX:

<label for="<%= Html.FieldIdFor(m => m.EmailAddress) %>">E-mail address:</label> 
<%= Html.TextBoxFor(m => m.EmailAddress) %>

Вы также можете использовать это в вызовах JavaScript, так как вы не будете знать идентификатор элемента управления заранее, и он может понадобиться для того, чтобы какой-то код JavaScript работал против него:

<script> $.CoolJQueryFunction('<%= Html.FieldIdFor(m => m.EmailAddress) %>'); </script>

Вспомогательный метод LabelFor HTML, который кто-то упомянул здесь, не позволит вам указать фактическую текстовую метку, которую вы хотите использовать, вам нужно украсить свои ViewModels атрибутами для установки текста метки, а IMHO уродлив. Я бы предпочел, чтобы материал отображался в самой части фактического представления ASPX, а не в какой-либо модели домена/представления. Хотя некоторые со мной не согласятся.

Не уверен в правилах публикации ссылок на сообщения в блоге, но я разместил блог именно на эту тему: http://www.dominicpettifer.co.uk/Blog/37/strongly-typed--label--elements-in-asp-net-mvc-2

person Sunday Ironfoot    schedule 18.06.2010
comment
Я знаю, но некоторые люди не могут понять правильно (мой английский не очень хорошо)! Это все, что мне нужно... Большое спасибо, чувак! Украшать классы модели предметной области атрибутами - не очень хорошая практика для меня, я согласен с вами! - person Felipe Oriani; 18.06.2010
comment
Смотрите мой ответ ниже, это больше не требуется - person Daniel Powell; 21.01.2013

В MVC 4 это уже встроено. см. это

person Daniel Powell    schedule 23.04.2012

Забавно, что можно найти в бесплатном исходном коде MVC. Вот ответ:

@Html.IdFor или @Html.NameFor

Так в чем же разница? Вот улов:

NameFor не заменит никакие "." к "_".

Если вам нужен пример, я нашел эта крутая небольшая статья

person Gabriel Andrés Brancolini    schedule 12.02.2013

Как уже было сказано, вам не нужно беспокоиться о ClientID, UniqueID и т. д. в ASP.NET MVC, поскольку это абстракции веб-форм. Вы можете просто просто написать ID, который вы хотите. Для этого также существует метод расширения:

<%= Html.LabelFor(x => x.Name) %>
person richeym    schedule 18.06.2010
comment
LabelFor даст вам строго типизированную ‹label›, но не позволит вам указать сам фактический текст метки, вы должны установить его против самой ViewModel в качестве атрибута свойства, для меня это странное упущение. - person Sunday Ironfoot; 18.06.2010

Используйте следующее:

Model.Name

Вы можете просто выполнить "просмотр исходного кода" или изучить отображаемое текстовое поле с чем-то вроде Firebug, чтобы увидеть, что генерируют методы Html.xyzFor(). Обычно они генерируют текстовое поле с атрибутами «id» и «name», установленными на имя свойства.

person womp    schedule 17.06.2010
comment
он напишет содержимое свойства, и мне это не нужно.. мне нужно имя свойства (или идентификатор клиента... если он есть... я точно не знаю) - person Felipe Oriani; 18.06.2010
comment
@FelipeOriani @womp при использовании Html.LabelFor(x => x.Id) показывает мне текст идентификатора, который я определил DisplayName идентификатора вместо значения идентификатора, которое поступает из БД. Любые комментарии? - person Steve; 20.07.2016