【问题标题】:Model Binding to Multiple Types with Same Property Names模型绑定到具有相同属性名称的多个类型
【发布时间】:2010-02-25 02:22:29
【问题描述】:

我有一个包含 2 个列表框的视图:受众和区域设置

我正在尝试向我的控制器提交一个包含两者的选定索引的表单,该控制器具有此签名的操作方法:

public JsonResult Submit(Audience aud, Locale loc)
{
// do stuff
}

我遇到的问题是 Audience 和 Locale 都有一个 ID 属性,因此 Model Binder 对于将所选值分配给哪个有点困惑。当 Audience 应该有 '2' 并且 Locale 应该有 '1' 时,两者都被分配了值 '1'

问题是如何让页面在提交时区分两者?我们已经尝试在 Locale 的 ID 值前面加上“locale.”,所以作为数据传递给控制器​​的参数字符串看起来像 "&locale.id=1&audience.id=2" 但这似乎不起作用。

有什么建议吗?如果需要更多信息,我会提供。

谢谢

戴夫

【问题讨论】:

    标签: asp.net-mvc model-binding


    【解决方案1】:

    用途:

    public JsonResult Submit([Bind(Prefix = "audience")]Audience aud,[Bind(Prefix = "locale")]Locale loc)
    {
    // do stuff
    }
    

    每个 Audience 字段在 html 字段中的名称中都应该有“audience”前缀:audience.id,audience.name,...

    <input id="audience_name" name="audience.Name" type="text" value="" />
    

    【讨论】:

    • 是的,这听起来像是要走的路,另一种选择是使用单个 ViewModel 并在里面放置两个实体类(如 Keith 所说),所以它将是 MyViewModel.Audience 和 MyViewModel.Locale遵循 Luk 之前提到的输入元素的命名约定。
    • 在您的示例中,您明确指定了前缀。我认为模型绑定器可以推断出来?
    • @Dave:AFAIK 它不能推断,但这可能在 MVC 版本之间发生了变化。如果您使用 ViewModel 类,它可能会推断出。
    • @Omar - 我并不是要将完整的实体放在 ViewModel 上。实体永远不应该在您的 ViewModel 中 - 您应该拥有 Id,然后映射到实体。
    • @Keith - 你是对的,但一切都取决于场景(有时你最终会创建与实体类几乎相同的视图模型),我永远不会直接保存 MYViewModel.Audience 对象在进行一些验证并处理可能篡改数据、CSRF、使用 Bind-Exclude 甚至一些 HMAC 之前,如果你正确处理了这些,你应该完全没有问题。
    【解决方案2】:

    您应该有一个特定的 ViewModel 用于将数据带入您的提交操作。该对象应具有 AudienceId 和 LocaleId。当您创建下拉列表时,您应该使用符合您期望的名称来创建它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-19
      • 1970-01-01
      相关资源
      最近更新 更多