【问题标题】:How does a form field in the view become associated with an object in the model?视图中的表单域如何与模型中的对象关联?
【发布时间】:2015-06-04 20:22:50
【问题描述】:

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

    [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:如何在不需要的领域创建这样的关联?我还有其他具有匹配名称但不是必需的模型变量和表单字段,并且它们不会自动关联。

谢谢!

【问题讨论】:

    标签: c# asp.net-mvc view model


    【解决方案1】:

    这与您的[Required] 属性无关。当您提交表单时,一系列名称/值对会根据表单控件的 name 属性(inputselecttextarea 元素)发送回您的控制器方法。

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-31
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      • 2018-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多