2

私は次のクラスを持っています:

class SomethingBase 
{
    public string SharedProperty { get; set; }
}

class ChildClassOne : SomethingBase 
{
    public string SpecificPropertyOne { get; set; }
}

class ChildClassTwo : SomethingBase 
{
    public string SpecificPropertyTwo { get; set; }
}

そして、2つのHTMLフォームを持つASP.NETMVCビューがあります。これらのフォームは同じアクションメソッドを呼び出しています。このアクションメソッドは、2つのSomethingBaseクラス派生物のいずれかを受け取る必要があります。ただし、のような単一のパラメータを作成するとSomethingBase param、のみSharedPropertyが受信されます。この動作は、ASP.NETMVCのバインディングメカニズムによって説明できます。

アクションメソッドを機能させるために、次の定義を作成しました。

public ActionResult(ChildClassOne param1, ChildClassTwo param2)

SharedProperty両方のパラメータに移動しますが、特定のプロパティは、実際にビューから渡されたオブジェクトに対してのみ入力されます。それは機能しますが、これが唯一の解決策ではないと思います。

この状況に対するベストプラクティスの解決策はありますか?

4

2 に答える 2

1

アクションは似ていないため、アクションごとにビューモデルを作成する必要があります。この場合、基本クラスを使用しようとする理由は実際にはありません。

于 2013-01-25T10:09:22.250 に答える
0

クラスのメソッドTryUpdateModelはそれを機能させます。Controllerただし、この方法はあまりエレガントではありません。

...
public ActionResult Save(FormCollection collection)
        {
            SomethingBase model = null;
            if (collection.AllKeys.Contains("SpecificOne"))
            {
                model = new ChildOne();
                TryUpdateModel<ChildOne>((ChildOne)model, collection);
            }
            else
            {
                model = new ChildTwo();
                TryUpdateModel<ChildTwo>((ChildTwo)model, collection);
            }
...
于 2013-01-25T13:40:43.677 に答える