我有一个强类型MVC视图控件,它负责用户可以创建和编辑客户端项的UI。我希望他们能够在创建时定义ClientId
,但不能进行编辑,这将反映在UI中。
为此,我有以下行:
<%= Html.TextBox("Client.ClientId", ViewData.Model.ClientId, new
{ @readonly =
(ViewData.Model.ClientId != null && ViewData.Model.ClientId.Length > 0
? "readonly" : "false")
} )
%>
似乎无论我给readonly属性取什么值(甚至是"false"one_answers"),Firefox和IE7都会将输入设为只读,这与直觉相悖。如果不需要,是否有一种基于三元运算符的方法可以完全删除属性?
棘手的问题。。。但是,如果只想定义readonly
属性,可以这样做:
<%= Html.TextBox("Client.ClientId", ViewData.Model.ClientId,
ViewData.Model.ClientId != null && ViewData.Model.ClientId.Length > 0
? new { @readonly = "readonly" }
: null)
%>
如果要定义更多的属性,则必须定义两个匿名类型并具有属性的多个副本。例如,像这样的东西(我无论如何都不喜欢):
ClientId.Length > 0
? (object)new { @readonly = "readonly", @class = "myCSS" }
: (object)new { @class = "myCSS" }
如果您想定义几个属性,并且条件只读而不重复其他属性,对于属性,可以使用Dictionary而不是匿名类型。
例如
Dictionary<string, object> htmlAttributes = new Dictionary<string, object>();
htmlAttributes.Add("class", "myCSS");
htmlAttributes.Add("data-attr1", "val1");
htmlAttributes.Add("data-attr2", "val2");
if (Model.LoggedInData.IsAdmin == false)
{
htmlAttributes.Add("readonly", "readonly");
}
@:User: @Html.TextBoxFor(
m => m.User,
htmlAttributes)
提示:仅存在readonly/dedisabled属性就可以使元素在浏览器中只读或禁用。
@Html.TextBoxFor(x => x.Name, isReadonly ?(object) new { @readonly = true } : new { /*Some other attributes*/ })
另一种选择是将其作为普通的旧HTML发出。是的,编辑器会让你认为自己错了,但这种情况在VS2008SP1中似乎经常发生。这个例子是专门针对CTP5中似乎完全浪费掉的复选框的,但它让您了解了如何发出条件属性。
<input type="checkbox" name="roles" value='<%# Eval("Name") %>'
<%# ((bool) Eval("InRole")) ? "checked" : "" %>
<%# ViewData.Model.IsInRole("Admin") ? "" : "disabled" %> />
我认为应该是
<%= ((bool) Eval("InRole")) ? "checked" : "" %>
而不是这个在麻风病人的回答。
<%# ((bool) Eval("InRole")) ? "checked" : "" %>
至少它对#不起作用,但对=起作用。我做错什么了吗?无论如何,感谢您的提示:)
我使用这个:
@Html.TextAreaFor(model => model.ComentarioGestor, comentarioGestor? new { @class = "form-control" } : new { @class = "form-control", @readonly = "readonly" } as object)
我尝试了上面的大多数建议,现在只需一行就可以找到最简单的建议。通过将其中一个对象声明为"对象"类型,组合两个匿名的html属性对象。
@Html.TextBoxFor(m => m.Email, !isEdit ? new { id = "email_box" } : new { id = "email_box", @readonly = isEdit ? "readonly" : "false" } as object)