Установить необязательный отключенный атрибут

Я хочу отключить все поля в моей форме, которые имеют значения при загрузке страницы. Например, в этом

<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);
}
Другие вопросы по тегам