2009-05-29 3 views
0

Controllerから継承する独自のCustomController基本クラスを作成しました。 同様に、ViewDataDictionaryを継承する独自のCustomViewDataを作成しました。 CustomControllerクラスには、CustomViewDataをパラメータとして受け入れるctorがあります。拡張コントローラーでのViewDataのタイプの変更

すべてのコントローラはCustomControllerから継承し、継承したCustomViewDataを渡します。 これで、私のコントローラ内からthis.ViewDataを呼び出すことができ、コントローラで渡されたビューデータを取得できます。現在、ViewDataDictionary(Controllerクラスから)が返されます。だから私は自分のタイプ情報を失った。

私のCustomController派生クラスのViewDataプロパティに型情報を保持する方法は、私のボクシングを行うget/setでラップしないでください。

答えて

0

私は私の目標を達成するためにいくつかの方法を試しましたが、私は存在すると知っていたこの醜い解決策のために保存することはできません。
私は基本的にget/setでboxing/unboxingをラップします。私はクラスチェーン全体を通してこれを行う必要があります。だから私のCommonControllerはCommonViewDataインスタンスでこれを行います。私のAbcController:CommonControllerはAbcViewDataからCommonViewDataを行います:CommonViewDataからCommonViewDataなどへ より良い解決策が見つかるまで、私はこれを実行しなければなりません。

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

は、ジェラルドの提案に沿った何かが行く方法だと思っています。あなたは本当にキャストヘイを避けたいと思う –

+0

はい、私ができるなら、私はそうしません。しかし、新しいキーワードで継承されたコントローラでインスタンスを作成してから、customControllerでViewDataの状態を変更すると、その状態は継承されたコントローラでは表現されません。新しいキーワードは基本的に前のものを隠します(アクセス不可能ですが、それでも存在します)ので、今度はビューデータの2つのインスタンスがあります。 ContengController.ViewData(CotengViewData)と1つはInheritedController.ViewData(InheritedViewData)です。 –

+0

あなたのカスタム1つの何か他の呼び出しして? in:customViewData型のCustomViewDataプロパティです。 –

1

のViewDataプロパティはControllerBaseクラスで定義され、あなたがそれをオーバーライドすることはできませんが、あなたはこれを行うことができます:

public class CustomController : Controller { 

    public new CustomViewData ViewData { get; set; } 

} 

しかし、あなたはこの

Controller c = myCustomControllerInstance; 
CustomViewData cvd = c.ViewData; 
ようCustomControllerのインスタンスにアクセスする場合、警告されます

ViewDataプロパティの既定の実装を使用しているため、コードがコンパイルされず、ViewDataDictionaryインスタンスが返されます。

+0

恐らく、私は新しいキーワードを使用できません。これは、ViewData変数のパラレルインスタンスを作成しているようです。私が達成しようとしているのは、アクションが実行される前に、私のフィールドのいくつかがCustomControllerクラスで満たされているということです。 –

+0

私が提案しようとしていたものを並べ替えますが、「新しい」キーワードはありません。 CustomViewData型のフィールド値を持ち、それを遅延させるのはなぜですか? –

関連する問題