我正在尝试在html文本框上动态设置disabled属性并出现问题
我在我看来试过这个:
string disabledString = "";
if (SomeLogic)
{
disabledString = "disabled";
}
Html.Textbox()...new Dictionary<string, object> { { "maxlength", 50 }, { "disabled", readOnlyState } })%>
正如您所看到的,我将disabled属性设置为“”或禁用,但是当我测试时,它似乎在任何一种情况下都被禁用。 我错过了什么吗?
答案 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会发生什么。