Установить необязательный отключенный атрибут - PullRequest
5 голосов
/ 08 декабря 2011

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

<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» Так как я могу это сделать?

P.S. Я использую ASP.NET MVC 3:)

Ответы [ 2 ]

6 голосов
/ 08 декабря 2011

Похоже, хороший кандидат для специального помощника:

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)
)
0 голосов
/ 28 мая 2013

Я использовал ответ Дарина.Однако, когда дело дошло до 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...