我有一个Html.TextBox(),我需要在某些条件下禁用它。使用TextArea,它是这样的:
<%=primaryLang ? Html.TextArea("e.location", new { rows = 2, cols = 60 }) : Html.TextArea("e.location", new { rows = 2, cols = 60, disabled = "true" })%>
但是使用TextBox是不可能的:
<%=primaryLang ?
Html.TextBox("e.startDate") :
Html.TextBox("e.startDate", new { disabled = "true"})%>
它会在值中发出{disabled = true}。这是因为唯一允许您传递HtmlAttributes的函数也需要传递模型。此视图是强类型的,并且模型会自动填写。
如果我这样传递:
Html.TextBox("e.startDate", Model.e.startDate, new { disabled = "true"})
或者像这样:
Html.TextBox("e.startDate", null, new { disabled = "true"})
GET版本可以使用,但POST版本会发出NullReferenceException。以上两者似乎都具有完全相同的效果。两者都将在GET上呈现模型中的正确数据。
如果我离开它就像这样:
Html.TextBox("e.startDate")
它对POST和GET都能正常工作......
为什么呢?有什么方法可以实现吗?
谢谢! :)
感谢下面的答案,我解决了这个问题:
<%=primaryLang ?
Html.TextBox("e.startDate") :
Html.Hidden("e.startDate") + Html.TextBox("e.startDate", null, new { disabled = "true"})%>
答案 0 :(得分:17)
已禁用的HTML元素不会回发到服务器。这就是当你设法禁用你的元素时你得到NullReferenceException的原因。
我不确定你想要实现什么,但是如果你不允许e.startDate可编辑,那么你不应该将它发回来,因为你应该已经知道了这个值。 所以你有两个选择。
警告:仅仅因为该元素被禁用,并不意味着某人无法编辑该值并将其发回。这只是一个建议。这取决于浏览器如何显示字段。如果你的POST代码确实接受了e.startDate值,那么任何有访问权限的人都可以使用开发工具编辑该字段。
答案 1 :(得分:12)
在POST上,“Model”或“e”属性可能为null。
你可以试试这个:
<%if (Model != null && Model.e != null) { %>
<%=Html.TextBox("e.StartDate", Model.e.StartDate, primaryLang ? null : new { disabled = "disabled" })%>
<%}%>