2012-05-04 10 views
6

こんにちはすべて私は車と呼ばれる基本クラスを持っていると私はそこにすべての車両に共通するすべてのプロパティを持っていると私は BaseおよびDerivedクラスとのASP.NET MVC 3.0モデルバインディング?

例車から派生車と呼ばれる複数の派生クラス、ジープを持っており、より多くのプロパティ

を追加します。

public class Vehicle 
{ 
    public int Color { get; set; } 
    public double Cost { get; set; } 
} 


public class Car : Vehicle 
{ 
    public SelectListItem Option { get; set; } 
} 

は私が私の見解は、私の見解で、私はページに表示するすべての車両をループしていますので、Pageクラスに強くタイプである私は、この

public class Page 
{ 
    public List<Vehicle> vehicles { get; set; } 
} 

のような車のリストを持っているPageクラスを持っています関数呼び出しVehicleConstants.GetTemplateNameだけで返すように、このように、このコードは@using内にある(Html.BeginForm())ので、我々はポストバックユーザーの選択

for(int i=0;i<Model.Vehicles.Count;i++) 
{ 
    <div id="Question"> 
     @{ 
      @Html.EditorFor(m => m.Vehicle[i], VehicleConstants.GetTemplateName(Model.Questions[i])); 
     } 
    <br /> 
    </div> 
} 

Iは、車両の種類ごとに1つのエディタテンプレートを使用しています車両

の種類に基づいて、このテンプレートを使用するテンプレートの名前は、単純にフォームがあるとき、私が午前問題がある車のクラスやジープクラス(派生クラス+基底クラス)

のプロパティを書き込み、私はコントローラのBaseクラスVehicleのプロパティにしかアクセスできませんプロパティの値を取得できませんサブクラスの車またはジープの。

 [HttpPost] 
    public string ReadPost(Page page) 
    { 
    } 

フォームがポストバックされたときにこれらの値を自動取得する最も良い方法は何ですか?

カスタムバインダークラスを私の唯一のオプションとして作成していますか?誰かがこれを行う方法について私にいくつかのサンプルコードを提供することができますか?どんな助けでも大歓迎です。

答えて

6

カスタムモデルバインダーを使用する必要があります。既定のモデルバインダーは、具体化するどの型をインスタンス化するのかわかりません。カスタムモデルバインダーが作成する具体的な型を示す各行の内側に隠しフィールドを含めることができます。私はshown this in action hereです。ところで、標準のテンプレート命名規則を使用することにより、使用しているforループとVehicleConstants.GetTemplateNameメソッドを取り除くことができることに注意してください。

関連する問題