2012-01-31 2 views
26

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

@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()?

ответ

51

Попробуйте

@Html.TextBoxFor(model => model.ProposalName, ViewBag.Disabled ? (object)new { disabled="disabled" } : new {}) 
+0

@epig .... интересный. какова должна быть ценность ViewBag.Disabled? – MikeTWebb

+1

@MikeTWebb ViewBag.Disabled должно быть логическим значением. – epignosisx

+0

@epig .... true или false - значения. Прекрасно работает! Спасибо – MikeTWebb

19

Решение Написал @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); 
} 

Here there is another example

8

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

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

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

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

+0

очень круто ...... – Bohn

5

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

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

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

2

Расширение @ ответ Джеймс, я написал это расширение 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().

Смежные вопросы