2015-11-20 169 views
1

我寫了一個抽象類PaymentMethod和2派生類,PaymentMethodInvoicePaymentMethodBilling。對於他們每個我寫共享EditorTemplates。 GET工作正常,我選擇了我的PaymentMethod並獲得正確的表單。如果我POST這個表單的模型綁定不起作用,它會嘗試實例化抽象類PaymentMethodAsp.net MVC模型綁定派生類

我必須重寫CreateModel(protected override object CreateModel)[1]還是有更好的解決方案來處理這個問題?

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

+0

這裏有什麼模式,你逝去的是什麼參數,POST操作的自定義模型綁定? – Imad

+2

是的,你需要創建一個自定義'ModelBinder' –

+0

@Imad PaymentMethod是ContractViewModel的屬性 – mlauth

回答

2

我必須重寫CreateModel

或是否有更好的溶液

在執行任何代碼之前,DefaultModelBinder通過首先初始化模型實例,然後讀取客戶端發送的名稱/值數據(表單數據,查詢字符串值等)來綁定您的模型。如果它在模型中找到匹配的屬性名稱,它將嘗試設置該屬性的值。在你的情況下,它初始化一個PaymentMethod的實例,所以即使通過你可能會發回與派生類關聯的附加值,它們也只是被拋棄。

您當然可以在方法中編寫代碼以手動讀取值,從那些值中確定要使用的派生類,初始化它並設置其值。但是,您不僅會在方法中添加很多難看的代碼,而且會錯過模型綁定的所有內置功能,例如ValueProviders,設置ModelState值和錯誤等,您還需要實現這些功能。

堅持與建議的方法,並創建一個覆蓋CreateModel()