6

こんにちは、Vehicle という基本クラスがあり、そこにはすべての車両に共通のすべてのプロパティがあり、Vehicle から派生してさらにプロパティを追加する Car、Jeep という複数の派生クラスがあります。

元:

    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 クラスに強く型付けされているので、私のビューでは、このようなページに表示するためにすべての車両をループしています。このコードは @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>
 }

車両の種類ごとに 1 つのエディター テンプレートを使用しているため、関数呼び出し VehicleConstants.GetTemplateName は、車両の種類に基づいて使用するテンプレートの名前を返すだけです。

このテンプレートは、単純に car クラスまたは Jeep クラス (派生クラス + 基本クラス) のプロパティを記述します。

私が抱えている問題は、フォームがポストバックされたときに、コントローラーの基本クラスの車両のプロパティにしかアクセスできないことです。サブクラスの車またはジープのプロパティの値を取得できません。

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

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

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

4

1 に答える 1

7

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

于 2012-07-13T06:26:12.303 に答える