【问题标题】:how do I set disabled attribute on html textbox in asp.net-mvc?如何在 asp.net-mvc 中的 html 文本框上设置禁用属性?
【发布时间】:2013-05-06 06:22:31
【问题描述】:

我正在尝试在 html 文本框上动态设置 disabled 属性并遇到问题

我认为这是我的尝试:

 string disabledString = "";
 if (SomeLogic)
 {
      disabledString = "disabled";
 }

 Html.Textbox()...new Dictionary<string, object> { { "maxlength", 50 }, { "disabled", readOnlyState } })%>

如您所见,我将 disabled 属性设置为 "" 或禁用,但是当我测试时,它似乎在任何一种情况下都被禁用。 我错过了什么吗?

【问题讨论】:

  • HTML 规范说如果在元素中看到“禁用”属性(具有任何值),则禁用。请参阅下面的解决方法。
  • 我希望你不是仅仅依靠 disabled 属性来防止数据被改变?如果您的绑定允许,稍微修改一下表单将允许他们更改“只读”值。
  • @Nathan Taylor - 你能澄清一下你的意思吗?
  • 好吧,如果你告诉 MVC 在代码级别绑定像“Title”这样的属性,但使用 disabled 属性“禁用”该属性,用户仍然可以使用分配的值发出表单请求标题通过绕过 disabled 属性。
  • 同意@Nathan,但这取决于您正在创建的应用程序的类型。对于 Intranet 应用程序,它可能没问题。为了做一个防弹的互联网应用,我只会依靠 disabled 属性来阻止从前端进入,但仍然检查后端的字段以确保它没有改变。

标签: html asp.net-mvc textbox


【解决方案1】:

这对我们来说很难看,因为这里的 HTML 规范很糟糕。

基本上在我们的视图代码中,我们有一些这样的逻辑:

bool isPlatformOwner = false;

object disabledAttributes = new { @disabled="disabled", @readonly="readonly" };

//omitted code setting isPlatformOwner    

    if (isPlatformOwner)
    {
        disabledAttributes = new { };
    }

然后,对于我们的控件,我们有这样的:

<%=Html.CheckBoxFor(f => f.AddToReleaseIndicator, disabledAttributes)%>

匿名类型在这里救了我们,但是,就像我说的,它有点难看。

【讨论】:

    【解决方案2】:

    实际上可以为 HtmlHelper 编写一个 Extension 类来执行此操作,但您必须实现许多覆盖,所以我发现最快的解决方案是编写一个字典扩展。

    你可以使用下面的类:

    public static class DictionaryExtensions
    {
        public static Dictionary<string, object> WithAttrIf(this Dictionary<string,object> dictionary,bool condition, string attrname, object value)
        {
            if (condition)
                dictionary[attrname] = value;
    
            return dictionary;
        }
    
        public static Dictionary<string, object> WithAttr(this Dictionary<string, object> dictionary, string attrname, object value)
        {
    
            dictionary[attrname] = value;
    
            return dictionary;
        }
    }
    

    要使用它,在你的视图中导入类,你的视图代码如下所示:

    @Html.TextBoxFor(m => m.FirstName,  new Dictionary<string, object>().WithAttr("class","input-large").WithAttrIf(!string.IsNullOrWhiteSpace(Model.FirstName),"readonly","yes"))
    

    您可以根据需要添加任意数量的属性,因为扩展方法会将值添加到字典并返回字典本身

    【讨论】:

      【解决方案3】:

      我认为您希望在启用时完全忽略 disabled 属性。旧版浏览器会查看以下内容并禁用文本框:

      <input type="text" disabled></input>
      

      换句话说,在较旧的 HTML 中,="disabled" 不是必需的,因此出于兼容性原因,如果您希望它正确呈现,您应该省略该属性。不过,我不确定如果您尝试严格的 DOCTYPE 会发生什么。

      【讨论】:

      • 我需要使用上述格式。这就是我在如何使用这种 html.textbox 格式添加条件属性上遇到的问题?
      猜你喜欢
      • 1970-01-01
      • 2014-01-23
      • 2014-08-24
      • 2010-11-28
      • 2017-05-10
      • 1970-01-01
      • 1970-01-01
      • 2010-10-28
      相关资源
      最近更新 更多