MVC3 / Razor - select标签中的禁用选项不会回发

时间:2013-01-31 21:59:17

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

我有一个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并且我启用了验证怎么办?

还有其他人遇到过这个吗?

由于

2 个答案:

答案 0 :(得分:2)

在下拉列表中发生change事件时,您可能会有一个隐藏字段会更新。这样,OccupationTypeId字段始终通过。

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

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

答案 1 :(得分:0)

  

有没有办法改变这种行为,还是内置于MVC 3?   我想过使用隐藏字段,但是如果是OccupationTypeId则是什么   需要,我已启用验证?

它与MVC 3无关;所有禁用的html元素一般不会回发。

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

See this similar thread.