asp.net MVC:如何禁用一个TextBox?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (44)

我有一个Html.TextBox(),我需要在某些条件下禁用它。使用TextArea可以这样:

<%=primaryLang ? Html.TextArea("e.location", new { rows = 2, cols = 60 }) : Html.TextArea("e.location", new { rows = 2, cols = 60, disabled = "true" })%>

但在文本框中,这是不可能的:

    <%=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 。

为什么?有什么方式来完成?

提问于
用户回答回答于

禁用的HTML元素不会回发到服务器。这就是为什么当你设法禁用你的元素时你会得到一个NullReferenceException。

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

  1. 按照原样显示e.startDate,但只需将post方法中的e.startDate值设置为默认值即可,或者完全忽略它。
  2. 如果您需要返回的值,则将e.startDate显示为标签,然后添加一个隐藏字段,其中包含e.startDate用于显示返回值。

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

用户回答回答于

在POST上,“Model”或“e”属性可能为null。

你可以试试这个:

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

扫码关注云+社区