MVC3 условно отключить Html.TextBoxFor () - PullRequest
27 голосов
/ 01 февраля 2012

У меня есть веб-приложение на C # .Net.В этом приложении мне нужно условно отключить Html.TextBoxFor элементы управления (также Html.DropDownListFor элементы управления) в зависимости от того, кто вошел в систему.Я попытался использовать

 @Html.TextBoxFor(model => model.ProposalName, new { @ViewBag.IsDisabled })

Где @ViewBag.IsDisabled имеет значение String.Empty или «отключено» в контроллере.Тем не менее, это отображается как IsDisabled='disabled' или IsDisabled="", поэтому управление не отключено.Когда я пытался

@Html.TextBoxFor(model => model.ProposalName, new { @ViewBag.Disabled })

Элемент управления всегда был отключен, даже если ViewBag.Disabled не содержал текста.Как можно условно отключить элементы управления Html.TextBoxFor()?

Ответы [ 5 ]

54 голосов
/ 01 февраля 2012

Попробуйте

@Html.TextBoxFor(model => model.ProposalName, ViewBag.Disabled ? (object)new { disabled="disabled" } : new {})
20 голосов
/ 01 ноября 2013

Решение, опубликованное @epignosisx, работает, но может возникнуть проблема, если вы захотите добавить какой-либо другой атрибут, потому что вам придется добавить его в оба объекта (один с disabled, а другой теперь пустой).

Еще хуже, если у вас есть какое-то другое свойство bool, потому что у вас будет четыре разных объекта, каждый для каждой комбинации.

Лучшее решение здесь (с небольшим количеством кода) состоит в созданииметод расширения для HtmlHelper для получения вашего логического свойства в качестве параметра.

public static MvcHtmlString TextBoxDisabledFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, bool disabled, object htmlAttributes = null)
{
    return TextBoxDisabledFor(htmlHelper, expression, disabled, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
}

public static MvcHtmlString TextBoxDisabledFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, bool disabled, IDictionary<string, object> htmlAttributes)
{
    if (htmlAttributes == null)
        htmlAttributes = new Dictionary<string, object>();
    if (disabled)
        htmlAttributes["disabled"] = "disabled";
    return htmlHelper.TextBoxFor(expression, htmlAttributes);
}

Здесь есть еще один пример

10 голосов
/ 21 сентября 2015

У меня возникла та же проблема, и я решил написать свой собственный метод расширения HtmlHelper.

public static MvcHtmlString Disable(this MvcHtmlString helper, bool disabled)
    {
        if (helper == null)
            throw new ArgumentNullException();

        if (disabled)
        {
            string html = helper.ToString();
            int startIndex = html.IndexOf('>');

            html = html.Insert(startIndex, " disabled=\"disabled\"");
            return MvcHtmlString.Create(html);
        }

        return helper;
    }

Это позволит принять логическое значение, указывающее, следует ли отключить элемент управления или нет.Он просто добавляет disabled="disabled" только внутри первого >, который встречается в строке.

Вы можете использовать его, как показано ниже.

@Html.TextBoxFor(model => model.ProposalName).Disable(true)

9 голосов
/ 20 сентября 2016

Вот метод, который я использую, который не требует расширений и не ограничивает вас только одним атрибутом HTML. Предполагается, что в вашей модели есть логическое свойство с именем «Disabled», но вы можете поместить туда все, что захотите, при условии, что оно оценивается как логическое для троичного оператора:

@Html.TextBoxFor(model => model.Whatever,
  new Dictionary<string, object>() {
    { "size", "5" },
    { "class", "someclasshere" },
    { model.Disabled ? "disabled" : "data-notdisabled", "disabled" }
  })

Ограничение стандартной сокращенной записи состоит в том, что имя атрибута не может быть динамическим. Создав словарь правильного типа, вы можете сделать имя атрибута динамическим, а затем передать этот словарь в текстовое поле в качестве словаря атрибутов. Если поле не должно быть отключено, оно передает атрибут с именем «data-notdisabled» вместо атрибута с именем «disabled», который браузер затем игнорирует.

6 голосов
/ 31 марта 2017

Расширяя ответ @ Джеймса, я написал это расширение HtmlHelper, которое обновляет / удаляет атрибут disabled, если он уже присутствует, или добавляет его, если нет:

public static MvcHtmlString Disable(this MvcHtmlString helper, bool disabled) {
    string html = helper.ToString();
    var regex = new Regex("(disabled(?:=\".*\")?)");
    if (regex.IsMatch(html)) {
        html = regex.Replace(html, disabled ? "disabled=\"disabled\"" : "", 1);
    } else {
        regex = new Regex(@"(\/?>)");
        html = regex.Replace(html, disabled ? "disabled=\"disabled\"$1" : "$1", 1);
    }
    return MvcHtmlString.Create(html);
}

Он также хорошо работает с самозакрывающимися тегами (например, <input />).

Использование такое же:

@Html.TextBoxFor(model => model.PropertyName).Disable(true)

Проверено на @Html.DropDownListFor() и @Html.TextBoxFor().

...