Asp.net MVC 模型绑定派生 class
Asp.net MVC Model binding derived class
我写了一个摘要 class PaymentMethod
和 2 个派生的 classes,PaymentMethodInvoice
和 PaymentMethodBilling
。对于他们每个人,我都写了 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()
的自定义模型活页夹
我写了一个摘要 class PaymentMethod
和 2 个派生的 classes,PaymentMethodInvoice
和 PaymentMethodBilling
。对于他们每个人,我都写了 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()