【发布时间】:2011-04-27 03:42:29
【问题描述】:
背景
我有一个付款页面,用户可以在其中从现有付款方式列表中进行选择,或指定一种新方式。下拉列表显示了以下选项:
- 签证 - ******1234(已保存)
- 万事达卡 - ******9876(已保存)
- [新信用卡...]
- [新的电子支票...]
使用 jQuery,我切换隐藏的 DIV,其中包含信息表(在选项 1 或 2 用于保存的付款方式的情况下)或表单(在 [new] 选项的情况下)。
我使用强类型类作为我的视图模型,其中包含(在简单类型中)一个 CreditCard 类和一个 Check 类。这些类中的每一个都使用数据注释验证器,因为它们在站点的其他部分中使用。
问题
当用户提交表单时,问题就出现了。我想使用模型绑定来处理 POST 值的映射,但我需要根据用户选择的选项来触发绑定和/或验证。例如,如果用户从上面的列表中选择选项 1 或 2,我不希望为 CreditCard 或 Check 对象触发模型验证(甚至可能是绑定本身)。
我研究了使用 IModelBinder 创建自定义模型绑定器以及扩展 DefaultModelBinder 并仅覆盖其中一些方法的可能性。但是,我不确定哪种方法更好,如果扩展 DefaultModelBinder,这将是覆盖的合适方法。
逻辑相当简单:
- 如果用户选择了一种现有的付款方式,则不需要对信用卡或支票进行验证。
- 如果用户选择其中一个选项来创建新的支付方式,则只需绑定和验证所选方式(信用卡或支票)
感觉好像扩展 DefaultModelBinder 是可行的方法,因为我希望大部分繁重的工作都由框架完成,而无需从头开始创建自定义绑定器。但是,在查看可用的重写方法时,不清楚哪个是最好的:
- BindProperty - 这里的问题是我基本上需要查看其中一个属性来确定应该绑定哪些其他属性。我认为我无法控制传入属性的绑定顺序,并且我不想依赖它们在 HTML 表单中设置的顺序。
- OnModelUpdated - 到此为止,为时已晚。数据注释的绑定验证已被触发并且 ModelState 已更新。我将不得不遍历 ModelState 并删除不相关的错误。
- OnPropertyValidating - 起初我认为这是我应该查看的地方,但即使为所有属性(作为测试)返回 TRUE 也会导致 ModelState 包含绑定错误。
我在应用程序的其他方面遇到过这种情况,并决定将功能拆分为单独的控制器/动作以简化流程。不过,我希望更好地了解如何处理更复杂的 UI 问题,尤其是与 MVC 模型绑定功能相关的问题。
我们将不胜感激有关此主题的任何帮助。
所有可能的值都存储在下拉列表中。使用 jQuery,我切换了表单(用于新的支付方式)和显示(用于现有的方式)
【问题讨论】: