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
ませPropNameCollision
んForm1.PropNameCollision
。 :
<input type="text" id="Form1_PropNameCollision" name="Form1.PropNameCollision" ... />
質問: コンテキスト内の特定の型を探し、それのみをバインドして返すバインダーを作成するスマートな方法はありますか? デフォルトのバインダーの をオーバーライドしてBindModel
、リフレクションでプリミティブをバインドすることに成功しましたが、パスは好ましくないように見えました (複雑な型、nullable などを考慮して)。
編集:モデルの受け入れを避けFormCollection
たいと思います。手を縛り続けたいからです。つまり、扱うべきではないデータを誤って操作したくないからです。他の誰かがコードを操作する必要があるとします。または、6 か月後に戻ってきて、サブクラスを分離する必要があることをすべて忘れていたとします。