首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MVC3:使用HtmlHelpers有条件地添加Disabled属性

MVC3:使用HtmlHelpers有条件地添加Disabled属性
EN

Stack Overflow用户
提问于 2011-11-02 17:33:03
回答 7查看 50.2K关注 0票数 73

我有一个ASP.Net MVC3Web应用程序,我正在使用HtmlHelper类向视图页面添加一个复选框,如下所示……

@Html.CheckBox("CheckBox1", true, new { @class = "Class1" })

我想做的是根据视图状态属性有条件地添加disabled属性。基本上,以下内容将是理想的……

@Html.CheckBox("CheckBox1", true, new { @class = "Class1", @disabled = Model.ReadOnly })

不幸的是,由于disabled属性的性质,这将不起作用,因为分配给disabled属性的任何false值(甚至“”)都将被转换为true。

我已经想出了一些解决方案来解决这个问题,所以问题不是我如何做到这一点。但是,有没有像上面期望的方法那样的简单方法呢?或者我必须求助于以下方法之一?

我知道我能做的..。

  1. 创建一个if/else语句并写入不同的禁用行(可读性不是很好-可能会抛出标记警告-不确定)
  2. 跳过HtmlHelper类并手动编写允许更好的条件属性的标记(保持代码较短,但添加了一个带有"disabled“参数的自定义帮助器(最干净的解决方案,但需要不需要的额外方法-可能是目前为止最好的选择)
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-11-02 23:14:09

在视图/帮助器中的某个位置定义它

@functions {
 object getHtmlAttributes (bool ReadOnly, string CssClass) 
 {
     if (ReadOnly) {
         return new { @class = CssClass, @readonly = "readonly" };
     }
     return new { @class = CssClass };
 }
}

然后使用:

@Html.TextBox("name", "value", @getHtmlAttributes(Model.ReadOnly, "test"))
票数 54
EN

Stack Overflow用户

发布于 2012-12-18 06:05:44

下面是我对这个类似问题的回答:https://stackoverflow.com/a/13922813/495000

我创建了以下Helper -它接受一个布尔值和一个匿名对象。如果disabled为true,它会将disabled属性添加到匿名对象(实际上是一个字典)中,值为"disabled",否则根本不会添加该属性。

public static RouteValueDictionary ConditionalDisable(
   bool disabled, 
   object htmlAttributes = null)
{
   var dictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);

   if (disabled)
      dictionary.Add("disabled", "disabled");

   return dictionary;
}

它的实际应用的一个示例:

@Html.TextBoxFor(m => m.SomeProperty,    
   HtmlHelpers.ConditionalDisable(true, new { @class = "someClass"))

对我来说,这种方法的一个巨大优势是,它可以与几乎所有的MVC HtmlHelpers一起工作,因为它们都有接受RouteValueDictionary而不是匿名对象的重载。

警告

HtmlHelper.AnonymousObjectToHtmlAttributes()使用一些花哨的代码忍者工作来完成任务。我不能完全确定它有多好。但对于我使用它的目的来说已经足够了。您的里程可能会有所不同。

我不太喜欢它的名字--但我想不出比这更好的名字了。重命名很容易。

我也不喜欢它的用法语法--但我再也想不出更好的了。改变这一点应该不难。对象上的扩展方法是一种想法...你最终会得到new { @class = "someClass" }.ConditionalDisable(true),但是如果你只想要disable属性,并且没有任何额外的东西可以添加,那么你最终会得到像new {}.ConditionalDisable(true);这样的东西,而且你还会得到一个对所有object都显示的扩展方法……这可能是不可取的。

票数 33
EN

Stack Overflow用户

发布于 2013-06-26 00:11:47

如果您希望在不需要助手函数的情况下使用更简洁的语法,则可以在定义用于@HTML.Checkbox助手的html属性的字典时使用三元语句...

@Html.CheckBox("CheckBox1", true, Model.ReadOnly 
       ? new { @class = "Class1", @disabled = Model.ReadOnly } 
       : null)

在这种情况下,如果Model.ReadOnly为false,则将null作为html属性的字典传递。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7978137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档