我有一个编辑页面,其中根据用户角色有条件地禁用了多个字段。禁用这些字段后,它们的值不会按预期方式发布到服务器上,这将导致ModelState无效,因为这些值是必需的。
要解决此问题,我想为字段添加Html.HiddenFor();以便仍然可以发布值(并在返回View时保留这些值)。但是,如果未禁用这些字段,那么我将同时拥有一个TextBoxFor和HiddenFor进入相同的模型属性。
我进行了几次测试,看来当发生这种情况时,表单上第一个元素的值将绑定到模型,而下一个元素将被忽略。如果是这种情况,那么我应该能够将HiddenFor放在TextBoxFor之后,在这种情况下,仅当禁用常规输入时,才会发布隐藏输入的值。
@Html.TextBoxFor(m => m.FirstName)
@Html.HiddenFor(m => m.FirstName) @*Only gets binded to the model if the above text box is disabled*@
(有一些JavaScript有条件地禁用了可见的TextBox)。
所以有两个问题:1)是否有文件证明MVC绑定将始终以这种方式工作;我可以安全地拥有这两个字段吗?
并且,2)是否有更好的方法来实现这一目标?我知道我可以在@If语句中使用HiddenFor,以便仅在禁用TextBox时才能创建它;但这是我要避免的View中很多额外的逻辑。
答案 0 :(得分:2)
DefaultModelBinder
按顺序从请求中读取值,并绑定第一个匹配的名称/值对,并忽略后续的匹配项(除非属性为IEnumerable
)。这就是CheckBoxFor()
方法确保始终将true
或false
值提交给控制器的方式(该方法生成带有value="True"
的复选框和带有{{1 }}),因此您可以安全地在文本框后添加隐藏的输入。
您可能会考虑将其设置为value="False"
而不是禁用的文本框,这意味着它将始终提交一个值,因此,您只需要一个输入(并且可以始终设置其样式为禁用状态,如果那就是你想要的。)