我正在尝试发布一个由两个强类型视图组成的表单。这个问题是相似的,但没有答案:
MVC 3 Razor Form Post w/ Multiple Strongly Typed Partial Views Not Binding
当我提交表单时,提交给控制器的模型始终为空。我花了几个小时试图让这个工作。这似乎应该是简单的。我在这里缺少什么?我不需要做ajax只需要能够发布到控制器并呈现一个新的页面。
谢谢
这是我的视图代码:
<div> @using (Html.BeginForm("TransactionReport","Reports",FormMethod.Post,new {id="report_request"})) { ViewContext.FormContext.ValidationSummaryId = "valSumId"; @Html.ValidationSummary(false,"Please fix these error(s) and try again.",new Dictionary<string,object> { { "id","valSumId" } }); @Html.Partial("_ReportOptions",Model.ReportOptions); @Html.Partial("_TransactionSearchFields",new ViewDataDictionary(viewData) { Model = Model.SearchCriteria }); }
这是控制器中的代码:
[AcceptVerbs(HttpVerbs.Post)] public ActionResult TransactionReport(TransactionReportRequest reportRequest) { var reportInfo = new List<TransactionReportItem>(); if (ModelState.IsValid) { var reportData = _reportDataService.GetReportData(Search.MapToDomainSearchCriteria(reportRequest.SearchCriteria)); if (reportData!=null) { reportInfo = reportData.ToList(); } return View(reportInfo); } return View(reportInfo); }
部分观点本身是相当无关紧要的,因为他们所做的一切都是在模仿和展示他们的模型。
解决方法
部分不是去这里的方式。您正在寻找EditorTemplates,这些是为您想要的。这种情况下,您的属性将很好地绑定到您的模型(您将提交)。
您的主视图将具有此窗体(请注意,您只需使用EditorFor而不是Partial;在这种情况下,您可能需要将该viewData参数放在ViewBag中):
@using (Html.BeginForm("TransactionReport",new {id="report_request"})) { ViewContext.FormContext.ValidationSummaryId = "valSumId"; @Html.ValidationSummary(false,"valSumId" } }); @Html.EditorFor(model => model.ReportOptions); @Html.EditorFor(model = Model.SearchCriteria }); }
现在你只需要拖动你的部分到文件夹〜/ Shared / EditorTemplates /,并重命名它们以匹配模型名称,他们是它们的编辑器模板。
还要看看here对EditorTemplates的很好的介绍。