Одним из вариантов является создание пользовательской версии Html.DropDownList, которая принимает дополнительный параметр и делает то, что вы хотите ... но тогда вам придется создать новую для каждого типа помощника - TextBoxFor, TextAreaFor, CheckBoxFor и т. Д. ... и вы все еще должны выяснить, как заставить это работать.
Вместо этого я решил создать Html Helper для замены обычного анонимного объекта HtmlAttributes, поскольку тогда он будет совместим со всеми хелперами, которые используют HtmlAttributes без какой-либо специальной работы. Это решение также позволяет вам проходить через дополнительные атрибуты, такие как класс, имя или что угодно. Он не блокирует вас только для инвалидов.
Я создал следующий Помощник - он принимает логический и анонимный объект. Если для параметра disabled установлено значение true, он добавляет атрибут disabled в анонимный объект (который фактически является словарем) со значением «disabled», в противном случае он вообще не добавляет свойство.
public static RouteValueDictionary ConditionalDisable(
bool disabled,
object htmlAttributes = null)
{
var dictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
if (disabled)
dictionary.Add("disabled", "disabled");
return dictionary;
}
Пример этого в действии:
@Html.TextBoxFor(m => m.SomeProperty,
HtmlHelpers.ConditionalDisable(true, new { @class = "someClass"))
1011 *
*
Одним из огромных преимуществ этого подхода для меня было то, что он работает практически со всеми MVC HtmlHelpers, поскольку все они имеют перегрузки, которые принимают RouteValueDictionary вместо анонимного объекта.
Предостережения
HtmlHelper.AnonymousObjectToHtmlAttributes () использует некоторую причудливую работу кода ниндзя, чтобы добиться цели. Я не совсем уверен, насколько он эффективен ... но этого было достаточно для того, для чего я его использую. Ваш пробег может отличаться.
Мне не особенно нравится его название - но я не мог придумать ничего лучше. Переименовать легко.
Мне также не нравится синтаксис использования - но опять же я не мог придумать ничего лучшего. Это не должно быть сложно изменить. Метод расширения для object
- это одна идея ... вы в конечном итоге получите new { @class = "someClass" }.ConditionalDisable(true)
, но тогда, если вам нужен только атрибут disable и у вас нет ничего дополнительного, вы получите что-то грубое, например new {}.ConditionalDisable(true);
и вы также получаете метод расширения, который обнаруживается для всех объектов ... что, вероятно, нежелательно.