【问题标题】:MVC3/Razor - Disabled options in select tag don't post backMVC3/Razor - 选择标签中的禁用选项不回发
【发布时间】:2013-01-31 21:59:17
【问题描述】:

我有一个 Employee 实体,我将其绑定到 MVC3/Razor 应用程序中的“编辑”视图。 Employee 实体具有OccupationTypeId 的属性。 OccupationTypeId 指向包含多个查找值的 OccupationType 表。自然的选择是使用@Html.DropDownListFor 来呈现包含职业列表的<select> 标记。

OccupationType 表架构相当标准:Id, Name, Description, IsEnabled。由于可以禁用 OccupationTypes,我希望 OccupationTypeId 下拉菜单仍然呈现禁用选项,以便用户在禁用时始终可以看到他们的选择,但用户无法选择禁用选项。换句话说,用户不能将现有的OccupationTypeId 更改为禁用的选项。

我考虑过创建一个@Html 扩展方法来使用选项构建我的<select> 标记,并简单地将disabled 属性附加到禁用的选项。我认为这将是直截了当的......

但是,禁用的选定选项似乎不会回传到控制器方法。换句话说,Employee.OccupationTypeId 在我发布到编辑时将为空。

有什么方法可以改变这种行为,或者它是内置在 MVC 3 中的吗?我考虑过使用隐藏字段,但是如果需要 OccupationTypeId 并且我启用了验证呢?

还有其他人遇到过这种情况吗?

谢谢

【问题讨论】:

  • 该行为没有内置在 MVC3 中,它内置在浏览器如何回发表单中。只有启用时,才会包含表单控件(即便如此,并非所有控件都像复选框一样总是包含在内)。
  • 以下帖子将为您指明正确的方向:stackoverflow.com/questions/11351554/…
  • 你试过只读吗?

标签: html asp.net-mvc asp.net-mvc-3 razor


【解决方案1】:

change 事件发生在下拉列表中时,您可以有一个隐藏字段得到更新。这样OccupationTypeId 字段总是被传递。

<input name='CurrentOccupationId' type='hidden' value='@Model.Employee.OccupationTypeId' />

<script>
    $(function() {
        $('#dropDownId').change(function() {
            $('input[name="CurrentOccupationTypeId"]').val($(this).val());
        });
    });
</script>

【讨论】:

  • 感谢您的快速回复。完美运行。
【解决方案2】:

有什么方法可以改变这种行为,或者它是内置在 MVC 3 中的吗? 我考虑过使用隐藏字段,但如果 OccupationTypeId 是 需要并且我启用了验证?

这与 MVC 3 无关;所有禁用的 html 元素通常不会回发。

我使用的解决方案是通过使用 CSS 设置适当元素的样式来“模拟”禁用元素。例如,您可以将元素的背景(或前景)颜色设置为灰色,并设置readonly 属性(当它有意义时)。

See this similar thread.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    相关资源
    最近更新 更多