Атрибуты HTML для EditorFor () в ASP.NET MVC - PullRequest
126 голосов
/ 17 сентября 2010

Почему я не могу передать атрибуты 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.

Ответы [ 14 ]

115 голосов
/ 23 мая 2013

Обновление MVC 5.1 теперь напрямую поддерживает следующий подход, поэтому он работает и для встроенного редактора.http://www.asp.net/mvc/overview/releases/mvc51-release-notes#new-features (Это либо случай, когда Великий разум думает одинаково, либо они читают мой ответ:)

Окончание обновления

Если вы используете собственный шаблон редактораили с MVC 5.1, который теперь поддерживает нижеприведенный подход непосредственно для встроенных редакторов.

@Html.EditorFor(modelItem => item.YourProperty, 
  new { htmlAttributes = new { @class="verificationStatusSelect", style = "Width:50px"  } })

затем в вашем шаблоне (не требуется для простых типов в MVC 5.1)

@Html.TextBoxFor(m => m, ViewData["htmlAttributes"])
96 голосов
/ 17 сентября 2010

EditorFor работает с метаданными, поэтому, если вы хотите добавить атрибуты html, вы всегда можете сделать это .Другой вариант - просто написать собственный шаблон и использовать TextBoxFor:

<%= Html.TextBoxFor(model => model.Control.PeriodType, 
    new { disabled = "disabled", @readonly = "readonly" }) %>    
42 голосов
/ 10 декабря 2013

Начиная с MVC 5.1, теперь вы можете делать следующее:

@Html.EditorFor(model => model, new { htmlAttributes = new { @class = "form-control" }, })

http://www.asp.net/mvc/overview/releases/mvc51-release-notes#new-features

6 голосов
/ 13 мая 2014

Сейчас ASP.Net MVC 5.1 получил встроенную поддержку для него.

Из заметок о выпуске

Теперь мы разрешаемпередача атрибутов HTML в EditorFor в качестве анонимного объекта.

Например:

@Html.EditorFor(model => model, 
              new { htmlAttributes = new { @class = "form-control" }, })
4 голосов
/ 29 мая 2015

Вот код VB.Net синтаксис для атрибутов HTML в MVC 5.1 EditorFor

@Html.EditorFor(Function(x) x.myStringProp, New With {.htmlAttributes = New With {.class = "myCssClass", .maxlength="30"}}))
3 голосов
/ 30 декабря 2010

Почему бы просто не использовать

@Html.DisplayFor(model => model.Control.PeriodType)
2 голосов
/ 29 января 2013

Вы все еще можете использовать EditorFor.Просто передайте атрибут style / whichever html как ViewData.

@Html.EditorFor(model => model.YourProperty, new { style = "Width:50px" })

Поскольку EditorFor использует шаблоны для визуализации, вы можете переопределить шаблон по умолчанию для своего свойства и просто передать атрибут стиля как ViewData.

Таким образом, ваш EditorTemplate хотел бы следующее:

@inherits System.Web.Mvc.WebViewPage<object>

@Html.TextBoxFor(m => m, new { @class = "text ui-widget-content", style=ViewData["style"] })
2 голосов
/ 17 сентября 2010

Если вы не хотите использовать метаданные, вы можете использовать атрибут [UIHint("PeriodType")] для украшения свойства или если это сложный тип, вам не нужно ничего украшать. Затем EditorFor будет искать файл PeriodType.aspx или ascx в папке EditorTemplates и использовать его вместо этого.

1 голос
/ 31 июля 2015

Установите условие с помощью ViewData в контроллере

ViewData["Modifiable"] = model.recProcessed;

Затем используйте эти данные представления в шаблоне редактора, чтобы установить атрибут html элемента управления

@Html.RadioButton(prefix, li.Value, li.Selected, @ViewData["Modifiable"].ToString().ToLower() == "true" ? (object)new  { @id = li.Value, @disabled = "disabled" } : new { @id = li.Value })
1 голос
/ 13 сентября 2014

В моем случае я пытался создать шаблон редактора ввода чисел 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" } } }

Подробно, но это работает.Возможно, вы могли бы использовать отражение в шаблоне, чтобы использовать имена свойств в качестве имен атрибутов вместо использования словаря.

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