asp.net MVC:禁用TextBox

Pal*_*tir 18 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" })%>
Run Code Online (Sandbox Code Playgroud)

但是使用TextBox是不可能的:

    <%=primaryLang ? 
      Html.TextBox("e.startDate") : 
        Html.TextBox("e.startDate", new { disabled = "true"})%>
Run Code Online (Sandbox Code Playgroud)

它将在值中发出{disabled = true}.这是因为唯一允许您传递HtmlAttributes的函数也需要传递模型.此视图是强类型的,并且模型会自动填充.

如果我这样传递:

Html.TextBox("e.startDate", Model.e.startDate, new { disabled = "true"})
Run Code Online (Sandbox Code Playgroud)

或者像这样:

Html.TextBox("e.startDate", null, new { disabled = "true"})
Run Code Online (Sandbox Code Playgroud)

GET版本可以使用,但POST版本将发出NullReferenceException.以上两者似乎都具有完全相同的效果.两者都将在GET上呈现模型中的正确数据.

如果我离开它就像这样:

Html.TextBox("e.startDate") 
Run Code Online (Sandbox Code Playgroud)

POST和GET都能正常工作......

为什么?有什么办法吗?

谢谢!:)


感谢下面的答案,我解决了这个问题:

<%=primaryLang ? 
        Html.TextBox("e.startDate") : 
          Html.Hidden("e.startDate") + Html.TextBox("e.startDate", null, new { disabled = "true"})%>
Run Code Online (Sandbox Code Playgroud)

Dav*_*enn 18

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

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

  1. 按原样显示e.startDate,但只需将post方法中的值e.startDate设置为默认值或完全忽略它.
  2. 如果您需要返回的值,则将e.startDate显示为标签,然后为您的发布后退值添加包含e.startDate的隐藏字段.

警告:仅仅因为该元素被禁用,并不意味着某人无法编辑该值并将其发回.这只是一个建议.这取决于浏览器如何显示字段.如果您的POST代码确实接受了e.startDate值,那么任何有访问权限的人都可以使用开发工具编辑该字段.


Jan*_*m B 12

在POST上,"Model"或"e"属性可能为null.

你可以试试这个:

<%if (Model != null && Model.e != null) { %>
<%=Html.TextBox("e.StartDate", Model.e.StartDate, primaryLang ? null :  new { disabled = "disabled" })%>
<%}%>
Run Code Online (Sandbox Code Playgroud)