asp.net MVC:禁用TextBox

时间:2009-09-15 09:51:38

标签: asp.net-mvc

我有一个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"})%>

2 个答案:

答案 0 :(得分:17)

已禁用的HTML元素不会回发到服务器。这就是当你设法禁用你的元素时你得到NullReferenceException的原因。

我不确定你想要实现什么,但是如果你不允许e.startDate可编辑,那么你不应该将它发回来,因为你应该已经知道了这个值。 所以你有两个选择。

  1. 按原样显示e.startDate,但只需将post方法中的值e.startDate设置为默认值或完全忽略它。
  2. 如果您需要返回的值,则将e.startDate显示为标签,然后为您的发布后退值添加一个包含e.startDate的隐藏字段。
  3. 警告:仅仅因为该元素被禁用,并不意味着某人无法编辑该值并将其发回。这只是一个建议。这取决于浏览器如何显示字段。如果你的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" })%>
<%}%>