0

基本クラスと、そこから派生するいくつかのクラスを作成しました。

これらのクラスを 1 つの ActionResult で使用したいのですが、PSBase を PS1 にキャストしようとすると、PSBase を PS1 に変換できないという System.InvalidCastException が発生します。

クラス:

public class PSBase
{
      public int stationId { get; set; }
      public string name { get; set; }
}

public class PS1 : PSBase
{
      public string reference { get; set; }
}

public class PS2 : PSBase
{
}

アクション結果:

    [HttpPost]
    public ActionResult ProductionStep(PSBase ps)
    {
        if (ModelState.IsValid)
        {
            var product = db.Product.FirstOrDefault(.........);

            switch (ps.stationId )
            {
                case 1:
                    {
                        product.Reference = ((PS1)ps).reference;
                        db.SaveChanges();
                        break;
                    }
            }
        }
        return View();
    }

各クラスに独自の ActionResult を持たせたくないので (同じコードを何度も繰り返します)、これらすべてを 1 つの ActionResult にまとめたかったのです。これを実装する方法はありますか?

4

1 に答える 1

2

あなたがやろうとしていることは、カスタム ModelBinder なしでは決して機能しません (それでも、実装することはお勧めしません)。

Controller から View にモデルを渡す場合にのみ、元の型 (継承などを含む) を記憶します。その時点ではまだページのサーバー側にいて、単にオブジェクトを渡しているだけだからです。

ビューに入ってフォームを送信すると、入力名に基づいた値のリストを含むボディを持つ POST リクエストが作成されます。

あなたの場合、PS1 に基づくフォームがあり、すべてのフィールドを入力として使用すると、次のようになります。

POST:
stationId = some value
name = some value
reference = some value

(元の型、コントローラー、方法等の記載はありません。)

ここで、MVC が行うことは、メソッドのヘッダーで使用している引数をチェックすることです (この場合、ProductionStep(PSBase ps))。

引数に基づいて、モデル バインダーを呼び出します。デフォルトのモデル バインダーが行うことは、そのクラス (この場合は PSBase) の新しいインスタンスを作成し、そのクラスのすべてのプロパティを介してリフレクションを経由し、POST 本体からそれらを取得しようとすることです。

POST 本文に余分な値がある場合、それらは忘れられます。

このデフォルトの MVC 実装用のカスタム モデル バインダーを作成しない限り、役に立ちません。

PSBase の異なる実装を受け入れる 2 つの個別のメソッドを作成することをお勧めします。

Model Binders の詳細については、http://msdn.microsoft.com/en-us/magazine/hh781022.aspxを参照してください。

編集:

2 つの別々のメソッドを作成するということは、次のようなことを意味します。

[HttpPost]
public ActionResult ProductionStepA(PS1 ps)
{
    if (ModelState.IsValid)
    {

    }
    return View();
}

[HttpPost]
public ActionResult ProductionStepB(PS2 ps)
{
    if (ModelState.IsValid)
    {

    }
    return View();
}

次に、異なるフォームアクションを介してビューでそれらを区別する必要があります。

于 2013-04-17T11:51:49.023 に答える