Установить необязательный отключенный атрибут
Я хочу отключить все поля в моей форме, которые имеют значения при загрузке страницы. Например, в этом
<td>@Html.TextBoxFor(m => m.PracticeName, new { style = "width:100%", disabled = Model.PracticeName == String.Empty ? "Something Here" : "disabled" })</td>
Я хочу написать в строке что-то вроде этого. Я не хочу использовать if-else и увеличивать код. Использование javascript/jquery тоже не приветствуется.
Я пытался написать false/true, но 1. Возможно, это не кросс-браузерный 2.Mvc проанализировал его как строку "True" и "False". Так как я могу это сделать?
PS Я использую ASP.NET MVC 3:)
2 ответа
Похоже, хороший кандидат на заказного помощника:
public static class HtmlExtensions
{
public static IHtmlString TextBoxFor<TModel, TProperty>(
this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TProperty>> ex,
object htmlAttributes,
bool disabled
)
{
var attributes = new RouteValueDictionary(htmlAttributes);
if (disabled)
{
attributes["disabled"] = "disabled";
}
return htmlHelper.TextBoxFor(ex, attributes);
}
}
который можно использовать так:
@Html.TextBoxFor(
m => m.PracticeName,
new { style = "width:100%" },
Model.PracticeName != String.Empty
)
Помощник, очевидно, мог бы сделать еще один шаг, чтобы вам не нужно было передавать дополнительное логическое значение, но он автоматически определяет, равно ли значение выражения default(TProperty)
и он применяет disabled
приписывать.
Другая возможность - это метод расширения, подобный этому:
public static class AttributesExtensions
{
public static RouteValueDictionary DisabledIf(
this object htmlAttributes,
bool disabled
)
{
var attributes = new RouteValueDictionary(htmlAttributes);
if (disabled)
{
attributes["disabled"] = "disabled";
}
return attributes;
}
}
который вы бы использовали со стандартом TextBoxFor
помощник:
@Html.TextBoxFor(
m => m.PracticeName,
new { style = "width:100%" }.DisabledIf(Model.PracticeName != string.Empty)
)
Я использовал ответ Дарина. Тем не менее, когда дело дошло до data_my_custom_attribute
, они не были представлены как data-my-custom-attribute
, Поэтому я изменил код Дарина, чтобы справиться с этим.
public static RouteValueDictionary DisabledIf(
this object htmlAttributes,
bool disabled
)
{
RouteValueDictionary htmlAttributesDictionary
= HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
if (disabled)
{
htmlAttributesDictionary["disabled"] = "disabled";
}
return new RouteValueDictionary(htmlAttributesDictionary);
}