Отображение тега label в Editor Template'е в ASP.NET MVC

04.07.2010 23:09 / Артём Волк / 1038 просмотров / ...

В 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>
<% } %>