【问题标题】:ASP.NET MVC - Disable Html Helper control using boolean value from ModelASP.NET MVC - 使用模型中的布尔值禁用 Html Helper 控件
【发布时间】:2010-11-21 03:39:08
【问题描述】:

我正在使用 Html 帮助程序将文本框输出到页面。我想根据模型中的布尔值是真还是假来动态添加 disabled 属性。

我的模型有一个返回布尔值的方法:

<% =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 />

最干净的方法是什么?

【问题讨论】:

标签: asp.net html asp.net-mvc


【解决方案1】:

这里应该可以解决问题:

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

【讨论】:

  • 我认为你在正确的轨道上,但这会引发语法错误,提示“无法确定条件表达式的类型,因为 AnonymousType#1 和 AnonymousType#2 之间没有隐式转换”
  • 可能跟第二个参数有关。我不确定您的问题是什么,因为似乎缺少逗号? Model.MyValuenew 是您想​​要的字段值吗?如果是这样,它应该是第二个参数,否则你应该能够只传递 null。我已经测试了第三个参数,它可以为您提供您要求的行为
  • 想通了。您只需要在每个“新”之前对 (object) 进行强制转换。见stackoverflow.com/questions/177673/…。如果你想更新你的答案,我会为你接受。
  • 但这不会启用文本框,即使 disabled="false"。只有在 enabled="true" 时才会启用。因此,您将不得不写入用于渲染控制的行,每行都为 enabled = "true" 和 disabled = "true"。
【解决方案2】:

在您的帮助程序中,当您生成 html 时,您是否会检查代码,它只是检查 bool,然后添加 disabled 属性或将其忽略?

这是一个简单的例子,结构不是很好,但是......

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

这是你要问的吗?

编辑:

等等,我明白了。我认为您需要创建自己的帮助程序或扩展 MVC 文本框帮助程序,以便您可以做到。

或者我认为你可以做类似的事情;

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

以上内容未经测试,但类似的东西应该可以工作。

编辑 2:

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

【讨论】:

  • 我无法扩展 MVC 帮助程序,因为传入的属性对象是匿名类型,我无法动态地将“禁用”属性附加到它。至于第二个建议,我已经尝试过了,但它不起作用,因为 disabled 属性要么存在于标签中,要么不存在 - 没有 disabled='true' 或 disabled='false'。跨度>
  • 我做了一些测试,是的,你不能这样做,所以我认为你有两个选择。 1)创建您自己的助手,它将禁用状态作为参数,然后呈现您的文本框。或 2) 有代码,根据状态,是否使用 disabled 属性呈现您的文本框。检查上面的第二次编辑。
【解决方案3】:

也许为时已晚,但希望它会有所帮助:

我最近一直在使用 ASP MVC,并且(因为我拒绝为每个可能的属性集使用一种匿名类型组合)意识到,从 MVC 2 开始,每个输入扩展方法都有两种形式:一种带有属性作为对象,一个作为IDictionary&lt;string, Object&gt; 元素。见the msdn API

所以,我最终编写了以下代码,我个人觉得创建多个对象要方便得多(实际上,对于多个选项或复选框控件,您可以只使用一个字典并随意添加或删除属性):

 <% 
  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)%>
  ...

【讨论】:

    【解决方案4】:

    使用此方法,您可以根据需要提供多个属性

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

    【讨论】:

    • 酷,这怎么能让他使用布尔值?
    猜你喜欢
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多