2012-02-24 9 views
0

まあ、 アップキャストクラス参照フォームを通してそれを取得した後

はのは、私は2つのモデルクラスを持っていると仮定しましょう。

ビューにDerivatedClassを渡してフォームを通じて情報を取得すると、再びDerivatedClassにキャスト可能ではありませんか?

問題は、ビュー(Model.GetType()。FullName)内でモデルの型を取得すると、(驚くことなく)DerivatedClass型を取得するということです。

しかし、私はモデルが投稿チェックインするとき、私のコントローラの内部で、私はBaseClassのを取得する(そして明らかに、それはキャストすることはできません!)

コントローラー:

public ActionResult ViewPage(){ 
    return View(new DerivatedClass()); 
} 

[HttpPost] 
public ActionResult ViewPage(BaseClass b){ 
    b.GetType().FullName;     //Gives me Project.packeges.BaseClass. 
    DerivatedClass d = (DerivatedClass)b; //Ops, It can't be done. Exception. 
} 

ビュー:

@model Project.packeges.BaseClass 

<h3>@Model.GetType().FullName</h3> 
<!-- Gives me Project.packeges.DerivatedClass --> 
... 

私のロジックは間違っていますか?とにかく、POST情報を取得した後、コントローラー内でこのキャストを行うことはありますか?

+0

正確に達成しようとしているのは何ですか?モデルタイプを持つことの全体的なポイントは、MVCのためのタイプを持つことができます*あなたのデータを*後にモデル化することです。ビューで実際に使用したいタイプとは異なるタイプを指定すると、自己倒産することになります。 –

+0

多分私は間違っています...しかし、基本クラスモデルを持つビューを子クラスに再利用できると便利だと思います...それはOOPのピラールの1つですね。コードの再利用は? –

答えて

1

モデルバインダーは、BaseClassのオブジェクトを作成し、プロパティを割り当てようとします。

したがって、コントロールがポストアクションに来ると、子クラスではなくBaseClassにインスタンスがあります。

したがって、ダウンキャスト時に例外をスローします。

BaseClassインスタンスが要求されたときに、CustomModelBinderとCreateインスタンスを使用してDerievedClassの要件を達成できます。

私は完全な説明と同様の投稿に答えました。

MyPostをご覧ください。あなたが探しているものかもしれません。

+0

あなたが言った投稿が私を助けることができると思います。しかし...もし私がCreateModel内で2つの派生クラスの中から選択する必要があれば? –

+0

心配しないで...私は私の問題を解決できました。ありがとうマナ。今度は、ModelBinderがPOSTの後にコントローラに情報を渡す方法をよく理解しています。 –

関連する問題