Отображение тега label в Editor Template'е в ASP.NET MVC
В ASP.NET MVC 2 появилась удобная возможность — определять шаблоны для отображения и редактирования свойств модели определённых типов (как стандартных, например String или DateTime так и пользовательских).
Шаблоны применяются, например, с помощью HTML-хелперов Html.EditorFor() и Html.DisplayFor(). Однако, чтобы добраться до мета-информации о редактируемом свойстве модели внутри подобных шаблонов придется постараться.
Возможность удобная, поэтому сразу возникает идея поместить в шаблон дополнительную разметку и <label /> с названием поля. К примеру, определим шаблон для типа DateTime для всего сайта, поместив его в файл ~\Views\Shared\EditorTemplates\DateTime.ascx:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.DateTime>" %>
<tr>
<td><label for="<Что здесь указать?>"><%=ViewData.ModelMetadata.DisplayName %>:</label></td>
<td><%=Html.TextBox(String.Empty, Model.ToString("g"))%></td>
</tr>
Сразу непонятно, как получить id <input />'а, который будет сгенерирован с помощью Html.TextBox(). Ответ нашелся:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.DateTime>" %>
<tr>
<td><label for="<%=ViewData.TemplateInfo.HtmlFieldPrefix.Replace(".", HtmlHelper.IdAttributeDotReplacement) %>"><%=ViewData.ModelMetadata.DisplayName %>:</label></td>
<td><%=Html.TextBox(String.Empty, Model.ToString("g"))%></td>
</tr>
В шаблон включена дополнительная разметка и <label />, атрибут for="" для которого будет корректно определён. Дополнительно можно применить один из скриптов для отображения календаря, для которого тоже понадобиться узнать id генерируемого <input />'a.
Во view для редактирования пользовательского типа (который тоже можно вынести в шаблон более высокого уровня) получившийся шаблон можно использовать следующим образом:
<% using (Html.BeginForm()) {%>
<table summary="Форма на странице">
<tbody>
<%--
Свойство Model.Snippet.Created имеет тип DateTime
--%>
<%= Html.EditorFor(f => Model.Snippet.Created)%>
</tbody>
</table>
<% } %>
