2

我编写了一个抽象类PaymentMethod和 2 个派生类, PaymentMethodInvoice以及PaymentMethodBilling. 对于他们每个人,我都写了 shared EditorTemplates

GET 工作正常,我选择我的PaymentMethod并获得正确的表格。如果我发布此表单,模型绑定不起作用,它会尝试实例化抽象类PaymentMethod

我必须覆盖 CreateModelprotected override object CreateModel还是有更好的解决方案来处理这个问题?

4

1 回答 1

2

我必须覆盖 CreateModel

不。

还是有更好的解决方案

不。

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

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

坚持推荐的方法并创建一个覆盖的自定义模型绑定器CreateModel()

于 2015-11-21T06:07:44.730 回答