2009-11-14 41 views
2

我有一個所有派生自基類型的類的層次結構,並且基類型也實現了一個接口。我想要做的是有一個控制器來處理整個層次結構的管理(因爲通過控制器公開的操作是相同的)。話雖如此,我希望視圖具有類型特定的字段和模型聯編程序綁定到一個隱藏的字段值。是這樣的:一般使用asp.net mvc模型綁定器

<input type="text" name="model.DerivedTypeSpecificField" /> 
<input type="hidden" name="modelType" value="MyDerivedType" /> 

話雖這麼說,在asp.net的MVC模型聯似乎需要,他們將創建的具體類型,因爲這個原因,我需要爲每一個派生類型創建一個不同的控制器。

有沒有人以前做過或知道如何操縱模型活頁夾以這種方式表現?我可以編寫我自己的模型綁定器,但我不想通過分配屬性和在目標類型上構建數組的基本模型綁定行爲。

謝謝!

回答

3

不知道是否會工作,但你可以嘗試這樣的:

public class MyBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     bindingContext.ModelType = System.Type.GetType(controllerContext.HttpContext.Request["modelType"]); 

     return base.BindModel(controllerContext, bindingContext); 
    } 
} 

這僅僅是簡單的基本模型粘結劑的變化。

+0

我想通了。我的解決方案與您的解決方案几乎完全相同,只不過我從ValueProviders數組中獲取modelType。謝謝! – 2009-11-14 04:50:14

2

查看MvcContrib中的派生類型ModelBinder。這允許您通過'typestamping'的模型綁定到派生類型 - 當使用RenderTypedPartial(...)幫助程序時會自動爲您處理。 MvcContrib partials在部分之間保持綁定狀態,因此Name/Id前綴可以在深對象圖上正確維護。如果您使用其他機制(如模板),那麼您需要自己處理打印類型。這在文檔頁面中有解釋。

回到您的問題以及如何使用ModelBinder解析派生類型,您可以使用類似於WCF KnownTypeAttribute的機制註冊派生類型變體,或者您可以在啓動時進行註冊。無論哪種方式,這些變化都會被記錄一次並保持在性能考慮之中。

模型聯編程序還以不干擾數據註釋/驗證屬性的方式解決了這個問題。他們將按照您在其他任何場景中的預期工作。