1

1 つのページに複数のフォームを配置し、各フォームをおしゃれなタブに表示したいと考えています。作業が実際に行われるモデルを保持するコンテナー モデルを作成すると考えました。次に、使用するパラメーターとして特定のモデルを受け入れるコントローラーで、各フォーム (/タブ) のハンドラーを作成します。

次のモデルを検討してください。

public class FormCollection
{
    public FormsContainer()
    {
        Form1 = new Form1();
        Form2 = new Form2();
    }
    public Form1 Form1 { get; set; }
    public Form2 Form2 { get; set; }
}

public class Form1
{
    public string PropNameCollision { get; set; }

    public DateTime? Form1Date { get; set; }
}

public class Form2
{
    public string PropNameCollision { get; set; }

    public DateTime? Form2Date { get; set; }
}

FormControllerコントローラーで:

public ActionResult Form1Handler(Form1 model)
{
    return Content("Doing Form1");
}
public ActionResult Form2Handler(Form2 model)
{
    return Content("Doing Form2");
}

そしてビュー:

@model MvcApp.Models.FormCollection
<section id="tab1">
@using (Html.BeingForm("Form1Handler", "Form"))
{
    @Html.TextboxFor(m => m.Form1.PropNameCollision)
    @Html.TextboxFor(m => m.Form1.Form1Date)
    <input type="submit"/>
}
</section>
<section id="tab2">
@using (Html.BeingForm("Form2Handler", "Form"))
{
    @Html.TextboxFor(m => m.Form2.PropNameCollision)
    @Html.TextboxFor(m => m.Form2.Form2Date)
    <input type="submit"/>
}
</section>

Form1いずれかのフォームを送信すると、デフォルトのモデル バインダーはモデルとコンテキストに到着したものを一致させることができPropNameCollisionませPropNameCollisionForm1.PropNameCollision。 :

<input type="text" id="Form1_PropNameCollision" name="Form1.PropNameCollision" ... />

質問: コンテキスト内の特定の型を探し、それのみをバインドして返すバインダーを作成するスマートな方法はありますか? デフォルトのバインダーの をオーバーライドしてBindModel、リフレクションでプリミティブをバインドすることに成功しましたが、パスは好ましくないように見えました (複雑な型、nullable などを考慮して)。

編集:モデルの受け入れを避けFormCollectionたいと思います。手を縛り続けたいからです。つまり、扱うべきではないデータを誤って操作したくないからです。他の誰かがコードを操作する必要があるとします。または、6 か月後に戻ってきて、サブクラスを分離する必要があることをすべて忘れていたとします。

4

2 に答える 2

1

フォームを部分ビューに入れてから、次のようにプロパティにバインドします

@Html.Partial("PartialViewForm1", model.Form1)
@Html.Partial("PartialViewForm2", model.Form2)

次に、メイン ビューを FormsContainer に厳密に型指定し、部分ビューを Form1 および Form2 に厳密に型指定できます。

あなたの場合、フォームと呼ばれる単一のクラスしかありませんが、プロパティは両方のクラスで同一であり、このタイプのプロパティが2つあるだけです。

于 2013-03-08T14:34:19.547 に答える