视图中的表单字段如何与模型中的对象相关联?

How does a form field in the view become associated with an object in the model?

这是一个由两部分组成的问题。首先,我知道如果在我的模型中使用它:

    [Required(ErrorMessageResourceType = typeof(Resources.CustomerSatisfactionSurvey), ErrorMessageResourceName = "Page1Question1Required")]
    public int? LikelyToReturn { get; set; }

然后在我看来是这样的:

@for (var c = 0; c < 11; c++)
    {
      @Html.RadioButtonFor(model => Model.LikelyToReturn, @c)
    }

我现在已经在模型中的对象 "LikelyToReturn" 和视图中同名的单选按钮组之间创建了关联。当用户选择单选按钮并单击提交按钮时,模型会更新,并且 LikelyToReturn 会填充所选值。发生这种情况时,我不必特别消瘦两者。

问题 1:这是如何以及为什么起作用的?我认为它与 [Required...] 标签有关,但我想确定一下。

问题 2:如何创建与不需要字段的关联?我有其他具有匹配名称的模型变量和表单字段,但不是必需的,它们不会自动关联。

谢谢!

这与您的 [Required] 属性无关。当您提交表单时,根据表单控件的 name 属性(inputselecttextarea 个元素)。

在您的情况下,您有一个单选按钮组(您使用 <input type="radio" name="LikelyToReturn" ... /> 生成 11 个控件),其值为 0 - 10。如果您 select 第三个单选按钮并提交,则发布的表单数据将是 LikelyToReturn: 2.

在控制器端,DefaultModelBinder 负责读取表单数据(以及其他值,例如路由数据)并将发布的值与您的模型属性进行匹配。如果您的模型包含名为 LikelyToReturn 的 属性,则其值将设置为 2

[Required] 属性是一个验证属性,用于验证您的 属性。在您的情况下,如果您手动包含一个额外的单选按钮

<input type="radio" name="LikelyToReturn" value="" />

和 select 编辑它,然后验证将失败,因为它会设置 LikelyToReturn=null; 并且错误会添加到 ModelState

如果您的模型中有其他未绑定的属性,那么很可能是因为 (1) 控件的 name 属性与您的 属性 名称不匹配,这这就是为什么您应该始终使用强类型 html 帮助程序在您的表单中生成 html,或者 (2) 您尝试绑定到字段而不是属性(即没有 { get; set; }