【问题标题】:Asp.net MVC Model binding derived classAsp.net MVC 模型绑定派生类
【发布时间】:2015-11-20 04:57:06
【问题描述】:

我编写了一个抽象类PaymentMethod 和两个派生类PaymentMethodInvoicePaymentMethodBilling。对于他们每个人,我都写了共享EditorTemplates

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

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

【问题讨论】:

  • 这里的模型是什么以及您传递给 POST 操作的参数是什么?
  • 是的,你需要创建一个自定义ModelBinder
  • @Imad PaymentMethod 是 ContractViewModel 的一个属性
  • @StephenMuecke 谢谢,它有效。我无法将您的评论标记为正确答案。 :-/

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


【解决方案1】:

我必须重写 CreateModel

没有。

或者有更好的解决方案

没有。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 2011-03-15
    相关资源
    最近更新 更多