代码之家  ›  专栏  ›  技术社区  ›  dotariel

ASP.NET MVC 2自定义模型绑定问题

  •  1
  • dotariel  · 技术社区  · 14 年前

    我有一个付款页面,用户可以从现有付款方式列表中选择,或指定一个新的付款方式。下拉列表显示选项,例如:

    1. * **** *1234(已保存)
    2. 万事达卡- **** *9876(已保存)
    3. [新信用卡…]

    使用jQuery,我切换隐藏的div,这些div包含一个信息表(对于保存的付款方式,选项1或2)或一个表单(对于[new]选项)。

    问题

    我研究了使用I model binder创建自定义模型绑定器、扩展DefaultModelBinder和重写某些方法的可能性。但是,我不确定哪种方法更好,如果扩展DefaultModelBinder,则哪种方法更适合重写。

    逻辑相当简单:

    • 如果用户选择其中一个选项来创建新的支付方法,则只需要绑定和验证所选方法(信用卡或支票)

    感觉好像扩展DefaultModelBinder是一种方法,因为我希望大部分繁重的工作都由框架完成,而无需从头创建自定义绑定器。但是,在查看要覆盖的可用方法时,不清楚哪个方法是最好的:

    1. BindProperty——这里的问题是,我基本上需要查看其中一个属性,以确定应该绑定哪些其他属性。我不认为我能控制传入属性的绑定顺序,我也不想依赖它们在HTML表单中的设置顺序。
    2. OnPropertyValidating-起初我认为这是我应该查看的地方,但即使对所有属性返回TRUE(作为测试)也会导致ModelState包含绑定错误。

    我在应用程序的其他方面遇到了这个场景,并决定将功能划分为单独的控制器/操作来简化流程。但是,我想更好地理解如何处理更复杂的UI问题,特别是与MVC模型绑定特性相关的问题。

    关于这个问题的任何帮助都将不胜感激。

    所有可能的值都存储在下拉列表中。使用jQuery,我切换表单(对于新的支付方法)和显示(对于现有方法)

    2 回复  |  直到 14 年前
        1
  •  1
  •   dotariel    14 年前

    我决定尝试完全绕过模型绑定,在控制器操作中使用FormCollection、IValueProvider和TryUpdateModel。

        2
  •  0
  •   John Farrell    14 年前

    您的问题听起来像是要放到默认的ModelBinder中。

    ModelBinder就是这样一个引诱你的诱饵,她假装可以解决你的所有问题。但随后你开始把ModelState合并在一起,开始用嵌套对象列表做疯狂的事情,在你知道之前,她用离婚文件扇你耳光,拿走了你的骨头以外的一切。

    MVC 3承诺提供一个更具扩展性的ModelBinder,但根据我个人的经验,除非它非常简单,您需要更改的内容,例如空的texbox变成“”而不是空的,而不是远离您自己的实现。

    if( myModel.IsNewPayment )
       UpdateModel( myModel.Payment, "exclude everything else" );
    

    你提出的要加入模型绑定器的很多东西实际上也是业务逻辑,应该放在另一层。我用自己的ModelBinder做了一些疯狂的事情,现在后悔在里面写的每一行代码。也许只有我,但你真的曲解了规则,把业务和支付逻辑放在里面,完全破坏了“单一责任原则”。