视图中的表单字段如何与模型中的对象相关联?
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
属性(input
、select
和 textarea
个元素)。
在您的情况下,您有一个单选按钮组(您使用 <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; }
)
这是一个由两部分组成的问题。首先,我知道如果在我的模型中使用它:
[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
属性(input
、select
和 textarea
个元素)。
在您的情况下,您有一个单选按钮组(您使用 <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; }
)