0

上手、

2つのモデルクラスがあるとしましょう。

public class BaseClass{
    public Int32 variable {get;set;}
}

public class DerivatedClass : BaseClass{
    public Int32 otherVariable {get;set;}
} 

そして、モデルとしてBaseClassタイプを持つビュー。

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情報を取得した後、コントローラー内でこのキャストを行う方法はありますか?

4

1 に答える 1

1

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

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

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

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

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

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

于 2012-02-24T09:51:15.513 に答える