【问题标题】:asp.net MVC: disable a TextBoxasp.net MVC:禁用文本框
【发布时间】:2010-11-28 09:55:35
【问题描述】:

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

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

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

    你可以试试这个:

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

    【讨论】:

      【解决方案2】:

      禁用的 HTML 元素不会回传到服务器。这就是当您设法禁用元素时会收到 NullReferenceException 的原因。

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

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

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

      【讨论】:

      • 就是这样,太棒了!我解决了它并用我的解决方法编辑了这个问题(将它粘贴到这里会丢失所有缩进并且不可读)。
      猜你喜欢
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多