Почему я не могу передать атрибуты html в EditorFor()
? например;
<%= Html.EditorFor(model => model.Control.PeriodType,
new { disabled = "disabled", readonly = "readonly" }) %>
Я не хочу использовать метаданные
Обновление : решение заключалось в том, чтобы вызвать это из представления:
<%=Html.EditorFor( model => model.Control.PeriodEndDate, new {Modifiable=model.Control.PeriodEndDateModifiable})%>
и использовать ViewData["Modifiable"]
в моих пользовательских EditorTemplates / String.ascx, где у меня есть некоторая логика представления, которая определяет, следует ли добавлять атрибуты только для чтения и / или отключенные во входные данные. Переданный анонимный объект EditorFor()
является вызываемым параметром, additionalViewData
и его свойства передаются в шаблон редактора в ViewData
коллекция.
html
asp.net-mvc
editorfor
Опечатка Джонсон
источник
источник
Ответы:
EditorFor
работает с метаданными, поэтому, если вы хотите добавить атрибуты html, вы всегда можете это сделать . Другой вариант - просто написать собственный шаблон и использоватьTextBoxFor
:источник
PeriodType
? Разве это не простая собственность? Если это сложный объект, вы можете настроить весь шаблон, поместив его часть,~/Views/ControllerName/EditorTemplates/SomeType.ascx
гдеSomeType
- имя типаPeriodType
свойства.@class
Например, было бы бессмысленно определять шаблон редактора, содержащий 3 блока. Помощник Html.TextBoxFor позволяет вам определить это, потому что вы знаете, что этот помощник генерирует - текстовое поле, поэтому имеет смысл определить класс для элемента ввода.Обновление MVC 5.1 теперь напрямую поддерживает описанный ниже подход, поэтому он работает и для встроенного редактора. http://www.asp.net/mvc/overview/releases/mvc51-release-notes#new-features (Это либо случай, когда Великий ум думает одинаково, либо они читают мой ответ :)
Конец обновления
Если вы используете собственный шаблон редактора или MVC 5.1, который теперь поддерживает приведенный ниже подход непосредственно для встроенных редакторов.
затем в вашем шаблоне (не требуется для простых типов в MVC 5.1)
источник
Начиная с MVC 5.1, теперь вы можете делать следующее:
http://www.asp.net/mvc/overview/releases/mvc51-release-notes#new-features
источник
EditorFor
шаблонами. Если вы реализуете свой собственный, вы должны следовать ответу AntonK.Теперь ASP.Net MVC 5.1 получил встроенную поддержку.
Из примечаний к выпуску
Например:
источник
Вот синтаксис кода VB.Net для атрибутов html в редакторе MVC 5.1.
источник
Почему бы просто не использовать
источник
Если вы не хотите использовать метаданные, вы можете использовать
[UIHint("PeriodType")]
атрибут для украшения свойства или, если это сложный тип, вам не нужно ничего украшать. Затем EditorFor будет искать файл PeriodType.aspx или ascx в папке EditorTemplates и использовать его вместо этого.источник
Сегодня я боролся с той же проблемой для флажка, который привязывается к nullable bool, и, поскольку я не могу изменить свою модель (не свой код), мне пришлось придумать лучший способ справиться с этим. Это немного грубая сила, но она должна работать в 99% случаев, с которыми я могу столкнуться. Очевидно, вам придется вручную заполнить допустимые атрибуты для каждого типа ввода, но я думаю, что я получил их все для флажка.
В моем шаблоне редактора Boolean.cshtml:
источник
Dictionary<string,string> attribs = new Dictionary<string,string>();
иattribs.Add("tabindex","16");
в одном из этих@( )
блоков вверху моей страницы. Затем я сделал это@Html.CheckBox("IsActive", Model.IsActive.HasValue ? Model.IsActive : false, attribs)
на своей странице и получил ошибку: «System.Web.Mvc.HtmlHelper <MyProject.Models.MyObject>» не содержит определения для «CheckBox» и перегрузки лучшего метода расширения «System.Web. Mvc.InputExtensions.CheckBox (System.Web.Mvc.HtmlHelper, string.bool, object) 'имеет недопустимые аргументы ".Вы все еще можете использовать EditorFor. Просто передайте стиль / любой атрибут html как ViewData.
Поскольку EditorFor использует шаблоны для рендеринга, вы можете переопределить шаблон по умолчанию для своего свойства и просто передать атрибут стиля как ViewData.
Итак, вашему EditorTemplate нужно следующее:
источник
вы можете использовать вот так; тот же вывод с
Html.EditorFor
, и вы можете добавить свои атрибуты htmlисточник
TextBoxFor
игнорирует любой тип,DisplayFormat
который вы можете попытаться применить.Просто создайте свой собственный шаблон для типа в Views / Shared / EditorTemplates / MyTypeEditor.vbhtml
Вызовите редактор из вашего представления со свойством модели:
Простите за синтаксис VB. Вот так мы и катимся.
источник
В моем случае я пытался создать шаблон редактора ввода чисел HTML5, который мог бы получать дополнительные атрибуты. Более аккуратным подходом было бы написать собственный HTML Helper, но поскольку у меня уже был шаблон .ascx, я выбрал следующий подход:
Этот уродливый бит создает ввод числового типа и ищет словарь ViewData с ключевыми «атрибутами». Он будет перебирать словарь, добавляя пары ключ / значение в качестве атрибутов. Регулярное выражение в атрибуте ID не имеет отношения и существует потому, что при использовании в коллекции
GetFullHtmlFieldId()
возвращает идентификатор, содержащий квадратные скобки,[]
которые обычно избегают как символы подчеркивания.Затем этот шаблон вызывается так:
Многословно, но работает. Вероятно, вы могли бы использовать отражение в шаблоне, чтобы использовать имена свойств в качестве имен атрибутов вместо использования словаря.
источник
Задайте условие, используя
ViewData
в контроллереЗатем используйте эти данные представления в шаблоне редактора, чтобы установить атрибут html элемента управления.
источник
Решение MVC 5.1 и выше (объединит локальные атрибуты HtmlAttributes и определенные в EditorTemplates):
Shared \ EditorTemplates \ String.cshtml:
Расширения:
Использование:
источник
source1
иsource2
asIDictionary<string, object>
. Я выполнил эту функцию:private static IDictionary<string, object> ToHtmlAttributesDictionary(this IEnumerable<KeyValuePair<string, object>> dico) { return dico.ToDictionary(s => s.Key.Replace('_', '-'), s => s.Value); }