В моем случае я пытался создать шаблон редактора ввода чисел HTML5, который мог бы получить дополнительные атрибуты.Более аккуратным подходом было бы написать свой собственный HTML Helper, но так как у меня уже был свой шаблон .ascx, я выбрал этот подход:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<input id="<%= Regex.Replace(ViewData.TemplateInfo.GetFullHtmlFieldId(""), @"[\[\]]", "_") %>" name="<%= ViewData.TemplateInfo.HtmlFieldPrefix %>" type="number" value="<%= ViewData.TemplateInfo.FormattedModelValue %>"
<% if (ViewData["attributes"] != null)
{
Dictionary<string, string> attributes = (Dictionary<string, string>)ViewData["attributes"];
foreach (string attributeName in attributes.Keys){%>
<%= String.Format(" {0}=\"{1}\"", attributeName, attributes[attributeName])%>
<% }
} %> />
Этот уродливый бит создает ввод числового типа и ищет ViewDataСловарь с ключом «атрибуты».Он будет перебирать словарь, добавляя свои пары ключ / значение в качестве атрибутов.Регулярное выражение в атрибуте ID не связано и существует потому, что при использовании в коллекции GetFullHtmlFieldId()
возвращает идентификатор, содержащий квадратные скобки []
, который обычно выводится как подчеркивание.
Этот шаблон затем называется какэто:
Html.EditorFor(m => m.Quantity, "NumberField", new { attributes = new Dictionary<string, string>() { { "class", "txtQuantity" } } }
Подробно, но это работает.Возможно, вы могли бы использовать отражение в шаблоне, чтобы использовать имена свойств в качестве имен атрибутов вместо использования словаря.