如何在asp.net-mvc中的html文本框上设置禁用属性?

时间:2010-08-09 19:26:58

标签: html asp.net-mvc textbox

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

我在我看来试过这个:

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

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

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

3 个答案:

答案 0 :(得分:16)

这对我们来说很难看,因为这里的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)%>

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

答案 1 :(得分:3)

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

您可以使用以下课程:

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"))

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

答案 2 :(得分:1)

我想你想要在启用它时完全省略disabled属性。较旧的浏览器会查看以下内容并禁用文本框:

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

换句话说,在较旧的HTML中,=“disabled”不是必需的,因此出于兼容性原因,如果您想要正确渲染,则应该省略该属性。我不确定如果你尝试严格的DOCTYPE会发生什么。