当有多个具有相同名称的输入时,MVC如何决定绑定哪个值?

问题描述 投票:0回答:1

我有一个编辑页面,根据用户的角色,有条件地禁用了几个字段。禁用字段时,它们的值不会发布到服务器(如预期的那样),这会导致ModelState无效,因为值是必需的。

为了解决这个问题,我想为字段添加Html.HiddenFor();这样一个值仍然会被发布(如果返回View,它将保留这些值)。但是,如果这些字段没有被禁用,那么我将同时将TextBoxFor和HiddenFor转到同一个模型属性。

我已经运行了几个测试,看起来当这种情况发生时,表单上第一个元素的值将绑定到模型,而下一个元素的值将被忽略。如果是这种情况,那么我应该能够在TextBoxFor之后放置HiddenFor,在这种情况下,只有在禁用常规输入时才会发布隐藏输入的值。

@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中的许多额外逻辑。

html asp.net-mvc model-binding
1个回答
2
投票

DefaultModelBinder按顺序读取请求中的值并绑定第一个匹配的名称/值对并忽略后续匹配(除非属性为IEnumerable)。这就是CheckBoxFor()方法确保truefalse值始终提交给控制器的方法(该方法使用value="True"生成一个复选框,使用value="False"生成隐藏输入),因此您可以在文本框之后安全地添加隐藏输入。

您可能考虑的一个选项而不是禁用的文本框,是使它成为readonly,这意味着它将始终提交一个值,因此您只需要一个输入(如果这是您想要的,您可以始终将其设置为禁用)。

© www.soinside.com 2019 - 2024. All rights reserved.