Идентификатор клиента для свойства (ASP.Net MVC) - PullRequest
21 голосов
/ 18 июня 2010

Я новичок в asp.net mvc, и у меня есть сомнения:

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

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

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

Спасибо

Приветствия

Ответы [ 5 ]

38 голосов
/ 18 июня 2010

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

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 атрибутами для установки текста надписи, с ИМХО это некрасиво.Я бы предпочел, чтобы материал отображался в самой части ASPX, а не в какой-либо модели домена / представления.Некоторые люди со мной не согласятся.

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

27 голосов
/ 23 апреля 2012

MVC 4 имеет это встроенное сейчас .. см. это

5 голосов
/ 12 февраля 2013

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

@Html.IdFor или @Html.NameFor

Так в чем же разница? Вот подвох:

NameFor не заменит любое "." на "_".

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

0 голосов
/ 18 июня 2010

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

<%= Html.LabelFor(x => x.Name) %>
0 голосов
/ 18 июня 2010

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

Model.Name

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

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