2009-05-29 43 views
0

我創建了自己的繼承自Controller的CustomController基類。 同樣,我創建了自己的CustomViewData,它從ViewDataDictionary繼承。 CustomController類具有接受CustomViewData作爲參數的ctor。在擴展控制器中更改ViewData的類型

我所有的控制器都繼承自CustomController並傳入其繼承的CustomViewData。 現在我想能夠從我的控制器中調用this.ViewData並獲取我在控制器中傳入的視圖數據。目前我得到一個ViewDataDictionary(從Controller類)。所以我丟失了我的類型信息。

如何在我的CustomController派生類中的ViewData屬性上保留我的類型信息,而無需將其包裝在爲我執行裝箱操作的get/set中?

回答

0

我嘗試了幾種方法來實現我的目標,但似乎沒有任何工作,除了我知道存在的這個醜陋的解決方案,但是......好吧,醜陋。
我基本上將裝箱/取消裝箱包裝在get/set中。我必須在整個班級鏈中做到這一點。因此,我的CommonController使用CommonViewData實例執行此操作,我的AbcController:CommonController從AbcViewData執行此操作:CommonViewData到CommonViewData等。 直到我找到一個更好的解決方案,我將不得不採用這個方法。

public new AbcViewData ViewData { 
    get { return base.ViewData as [bcViewData; } 
    set { base.ViewData = value; } 
} 
1

ViewData的屬性在ControllerBase類中定義的,你不能覆蓋它,但你可以這樣做:

public class CustomController : Controller { 

    public new CustomViewData ViewData { get; set; } 

} 

但要注意,如果你訪問一個CustomController例如像這樣

Controller c = myCustomControllerInstance; 
CustomViewData cvd = c.ViewData; 

您的代碼將無法編譯,因爲您將使用ViewData屬性的默認實現,並且它將返回一個ViewDataDictionary實例。

+0

我擔心我不能使用新的關鍵字,因爲它似乎是一個ViewData變量的並行實例。我試圖完成的是,在執行操作之前,我的一些字段由CustomController類填充。 – 2009-06-02 08:21:00

+0

排序我會建議:但沒有'新'關鍵字。爲什麼你可以爲你的CustomViewData類型和lazy-init創建一個字段值呢? – 2009-06-02 08:36:02