目前,我想要张贴的两个强类型的视图组成形式。 这个问题是相似的,但它没有一个答案:
MVC 3剃须刀表单提交W /多强类型的局部视图不具约束力
当我提交表单提交给控制器模型总是空。 我花了几个小时试图让这项工作。 这似乎应该是简单的。 我失去了一些东西在这里? 我并不需要做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
;在这种情况下,你可能需要把该可视数据参数在ViewBag左右):
@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.EditorFor(model => model.ReportOptions);
@Html.EditorFor(model = Model.SearchCriteria });
}
现在,你只需要拖动谐音的文件夹~/Shared/EditorTemplates/
并重新命名,以配合他们的编辑模板的型号名称。
在~/Shared/EditorTemplates/
文件夹中,一个新的“视图”,例如“SearchCriteria.cshtml”。 在内部,把为“模型”类的类型,你要创建一个编辑模板。 实施例(实施例类具有属性Name
和OtherCriteria
):
@model MyNamespace.SearchCriteria
<ul>
<!-- Note that I also use EditorFor for the properties; this way you can "nest" editor templates or create custom editor templates for system types (like DateTime or String or ...). -->
<li>@Html.LabelFor(m => m.Name): @Html.EditorFor(m => m.Name)</li>
<li>@Html.LabelFor(m => OtherCriteria): @Html.EditorFor(m => m.OtherCriteria</li>
</ul>
一些良好的阅读有关他们:
- https://www.exceptionnotfound.net/asp-net-mvc-demystified-display-and-editor-templates/
- https://www.hanselman.com/blog/ASPNETMVCDisplayTemplateAndEditorTemplatesForEntityFrameworkDbGeographySpatialTypes.aspx
您应该添加前缀PartialView的领域。 这将让正确绑定数据。
所以与其:
@Html.Partial("_ReportOptions", Model.ReportOptions);
使用:
@Html.Partial("_ReportOptions", Model.ReportOptions, new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "ReportOptions" }})
我同意@Styxxy和@Tony,编辑模板是更好的解决方案。 然而,你的问题是,你是喂子模型的局部视图。 因此,当局部视图渲染它不知道,这是一个更大的模型的一部分,并不会产生正确的名称属性。
如果你坚持使用局部模板,而不是编辑模板,那么我建议只透过模型的泛音,然后有每个部分做Model.Whatever.Foo,它会产生正确的名称属性绑定。
尝试使用EditorTemplates而不是局部模板http://coding-in.net/asp-net-mvc-3-how-to-use-editortemplates/ 。
@Html.Partial("_ReportOptions", Model.Contact, new ViewDataDictionary()
{
TemplateInfo = new TemplateInfo()
{
HtmlFieldPrefix = "Contact"
}
})
)
@Html.Partial("_TransactionSearchFields", Model.SearchCriteria, new
ViewDataDictionary()
{
TemplateInfo = new TemplateInfo()
{
HtmlFieldPrefix = "SearchCriteria"
}
})