我有一个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并且我启用了验证怎么办?
还有其他人遇到过这个吗?
由于
答案 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属性(当它有意义时)。