我想在一个页面上有多个表单,每个表单都显示在一个花哨的选项卡上。我想我会创建一个容器模型来保存工作实际发生的模型。然后,我将为控制器中的每个表单(/选项卡)创建处理程序,接受特定模型作为我要使用的参数。
考虑以下模型:
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
到达,因为这是由助手生成的原始 HTML 标记:
<input type="text" id="Form1_PropNameCollision" name="Form1.PropNameCollision" ... />
问题:是否有一种聪明的方法来创建一个在上下文中查找特定类型并绑定+返回的绑定器?我在重写默认绑定器时做了一些涂鸦BindModel
,设法将基元与反射绑定,但路径似乎并不理想(考虑到复杂类型、可空值等)。
编辑:我想避免接受FormCollection
模型,因为我想束手无策,这意味着我不想意外使用我不应该使用的数据。假设其他人需要使用代码,或者我在 6 个月后回到它,我忘记了需要分离子类的所有内容。