ASP.NET MVC - отключить управление Html Helper с использованием логического значения из модели

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

В моей модели есть метод, который возвращает логическое значение:

<% =Model.IsMyTextboxEnabled() %>

В настоящее время я представляю текстовое поле следующим образом, но я хочу включить или отключить его:

<% =Html.TextBox("MyTextbox", Model.MyValuenew { id = "MyTextbox", @class = "MyClass" })%>

Если возвращаемое значение Model.IsMyTextboxEnabled() == true, я хочу, чтобы выводилось следующее:

<input class="MyClass" id="MyTextbox" name="MyTextbox" type="text" value="" />

Если это == false, я хочу, чтобы он выводился как:

<input class="MyClass" id="MyTextbox" name="MyTextbox" type="text" value="" disabled />

Каков самый чистый способ сделать это?

Ответы

Ответ 1

Это должно сделать трюк:

<%= Html.TextBox("MyTextbox", Model.MyValuenew,           
      (Model.IsMyTextboxEnabled() ? (object) new {id = "MyTextbox", @class = "MyClass"}
                                  : (object) new {id = "MyTextbox", @class = "MyClass", disabled="true" })) %>

Ответ 2

В вашем помощнике у вас будет проверка кода, когда вы генерируете html, который просто проверяет bool, а затем либо добавляет отключенный атрибут, либо оставляет его?

Это простой пример и неструктурированный, но...

if (disabled)
return string.Format(CultureInfo.InvariantCulture, "<input type=text disabled/>", new object[] { HttpUtility.HtmlAttributeEncode(s), myTextBox });

Это то, о чем вы спрашивали?

EDIT:

Подождите, я вижу сейчас. Я думаю, вам нужно либо создать свой собственный помощник, либо расширить помощник текстового поля MVC, чтобы вы могли это сделать.

Либо это, либо вы можете сделать что-то вроде:

<%= Html.TextBox("mytextbox","", new { disabled="true" } %>

Вышеупомянутый непроверен, но что-то вроде этого должно работать.

ИЗМЕНИТЬ 2:

<% if (condition) {%>
  <%= Html.TextBox("mytextbox", "", new {@readonly="readonly"}) %>
<%} else {%>
  <%= Html.TextBox("mytextbox", "") %>
<%}

Ответ 3

Слишком поздно возможно, но надеюсь, что это поможет:

Недавно я работал с ASP MVC и (поскольку я отказался иметь одну комбинацию анонимных типов для каждого возможного набора атрибутов) понял, что с MVC 2 каждый метод расширения ввода имеет две формы: одну с атрибутами как Объекты и один как IDictionary<string, Object>. См. API msdn

Итак, я закончил кодирование следующего, что лично мне гораздо удобнее создавать несколько объектов (на самом деле, для нескольких опций или элементов управления флажками вы можете использовать только один словарь и добавлять или удалять свойства по своему усмотрению):

 <% 
  IDictionary<string, Object> radioAttrs = new Dictionary<string, Object>();
  radioAttrs.Add("class", "radioBot");
  if (Model.EnabledRegistro)
  {
      radioAttrs["onclick"] = "updateControlsForInfoNom(true)";
  } 
  else
  {
     radioAttrs["disabled"] = "disabled";
  }
  %>

  <%: Html.RadioButtonFor(model => model.Accion.calculoRegistro, "true", radioAttrs)%>
  ...

Ответ 5

С помощью этого метода вы можете предоставить несколько атрибутов при необходимости

@Html.TextBox("mytextbox", new {}, new { @class = "myclass", disabled = "true" })