Asp.net MVC 模型绑定派生 class

Asp.net MVC Model binding derived class

我写了一个摘要 class PaymentMethod 和 2 个派生的 classes,PaymentMethodInvoicePaymentMethodBilling。对于他们每个人,我都写了 shared EditorTemplates.

GET 工作正常,我 select 我的 PaymentMethod 并获得了正确的形式。如果我 POST 这种形式的模型绑定不起作用,它会尝试实例化抽象 class PaymentMethod

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

Must I override the CreateModel

没有

or is there a better solution

没有

在执行您方法中的任何代码之前,DefaultModelBinder 通过首先初始化您的模型实例然后读取客户端发送的 name/value 数据(表单数据、查询字符串值等)。如果它在您的模型中找到匹配的 属性 名称,它将尝试设置该 属性 的值。在你的例子中,它初始化了一个 PaymentMethod 的实例,所以即使你可能会发回与派生的 classes 之一相关联的附加值,它们也会被丢弃。

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

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

的自定义模型活页夹