Asp.net mvc ASP.NET MVC 2自定义模型绑定问题
背景 我有一个付款页面,用户可以从现有付款方式列表中进行选择,或指定新的付款方式。下拉列表显示以下选项:Asp.net mvc ASP.NET MVC 2自定义模型绑定问题,asp.net-mvc,model-binding,Asp.net Mvc,Model Binding,背景 我有一个付款页面,用户可以从现有付款方式列表中进行选择,或指定新的付款方式。下拉列表显示以下选项: Visa-*******1234(已保存) 万事达卡-*******9876(已保存) [新信用卡…] [新电子支票…] 使用jQuery,我切换隐藏的div,这些div包含一个信息表(对于保存的付款方法,是选项1或2)或一个表单(对于[new]选项) 我使用一个强类型类作为我的视图模型,它包含(在简单类型中)一个CreditCard类和一个Check类。这些类中的每一个都使用数据注释验证器
- 如果用户选择了现有的付款方式之一,则不需要对信用卡或支票进行验证
- 如果用户选择其中一个选项来创建新的付款方式,则只需要绑定和验证所选的方式(信用卡或支票)
所有可能的值都存储在下拉列表中。使用jQuery,我可以切换表单(对于新的付款方式)和显示(对于现有方式)您的问题听起来很专业,可以放在默认的ModelBinder中 ModelBinder是一个诱惑者,以她能解决你所有的问题为借口引诱你。但是你开始把ModelState合并在一起,然后开始用嵌套对象列表做一些疯狂的事情,在你意识到之前,她用离婚文件扇你耳光,拿走除了你的骨头以外的所有东西 MVC 3承诺提供更具可扩展性的ModelBinder,但根据我个人的经验,除非您需要更改的内容非常简单,例如空文本框变为“”而不是null,而不是远离您自己的实现 另一种方法是零碎地使用现有的ModelBinder功能,并使用诸如忽略方法参数之类的方法来清理:
if( myModel.IsNewPayment )
UpdateModel( myModel.Payment, "exclude everything else" );
您提议填充到模型绑定器中的很多内容实际上也是业务逻辑,应该放在另一层中。我用自己的ModelBinder做了一些疯狂的事情,现在我后悔在那里写的每一行代码。也许只是我,但你真的违反了规则,将业务和支付逻辑放在了“单一责任原则”中,彻底破坏了它。你的问题听起来很专业,可以放在默认的ModelBinder中 ModelBinder是一个诱惑者,以她能解决你所有的问题为借口引诱你。但是你开始把ModelState合并在一起,然后开始用嵌套对象列表做一些疯狂的事情,在你意识到之前,她用离婚文件扇你耳光,拿走除了你的骨头以外的所有东西 MVC 3承诺提供更具可扩展性的ModelBinder,但根据我个人的经验,除非您需要更改的内容非常简单,例如空文本框变为“”而不是null,而不是远离您自己的实现 另一种方法是零碎地使用现有的ModelBinder功能,并使用诸如忽略方法参数之类的方法来清理:
if( myModel.IsNewPayment )
UpdateModel( myModel.Payment, "exclude everything else" );
您提议填充到模型绑定器中的很多内容实际上也是业务逻辑,应该放在另一层中。我用自己的ModelBinder做了一些疯狂的事情,现在我后悔在那里写的每一行代码。也许只有我一个人,但你真的违反了规则,把业务和支付逻辑放在了这里,彻底破坏了“单一责任原则”。我决定