Asp.net MVC模型绑定派生类

时间:2015-11-20 04:57:06

标签: c# asp.net asp.net-mvc model-binding defaultmodelbinder

我写了一个抽象类PaymentMethod和2个派生类PaymentMethodInvoicePaymentMethodBilling。对于他们每个人,我都写了共享的EditorTemplates。 GET工作正常,我选择我的PaymentMethod并获得正确的表格。如果我POST这个表单,模型绑定不起作用,它会尝试实例化抽象类PaymentMethod

我必须覆盖CreateModel(protected override object CreateModel)[1]还是有更好的解决方案来处理这个问题?

[1] MVC 3 Model Binding a Sub Type (Abstract Class or Interface)

1 个答案:

答案 0 :(得分:2)

  

我必须覆盖CreateModel

没有

  

还是有更好的解决方案

没有

在执行方法中的任何代码之前,DefaultModelBinder通过首先初始化模型实例然后读取客户端发送的名称/值数据(表单数据,查询字符串值等)来绑定模型。如果它在模型中找到匹配的属性名称,它将尝试设置该属性的值。在您的情况下,它初始化PaymentMethod的实例,因此即使您可能会回发与其中一个派生类关联的其他值,它们也会被抛弃。

您当然可以在方法中编写代码来手动读取Request.Form值,从这些值中确定要使用的派生类,对其进行初始化并设置其值。但是,您不仅会在方法中添加大量丑陋的代码,而且会错过模型绑定的所有内置功能,例如ValueProviders,设置ModelState值和错误等。你还需要实施。

坚持使用推荐的方法并创建一个覆盖CreateModel()

的自定义模型绑定器