后与多个局部视图形式(Post a form with multiple partial views

2019-06-24 11:52发布

目前,我想要张贴的两个强类型的视图组成形式。 这个问题是相似的,但它没有一个答案:

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);
}

部分观点本身是相当无关紧要,因为他们所做的一切是招标和显示他们的模型。

Answer 1:

泛音不走这里的路。 您正在寻找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”。 在内部,把为“模型”类的类型,你要创建一个编辑模板。 实施例(实施例类具有属性NameOtherCriteria ):

@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


Answer 2:

您应该添加前缀PartialView的领域。 这将让正确绑定数据。

所以与其:

@Html.Partial("_ReportOptions", Model.ReportOptions);

使用:

@Html.Partial("_ReportOptions", Model.ReportOptions, new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "ReportOptions" }})


Answer 3:

我同意@Styxxy和@Tony,编辑模板是更好的解决方案。 然而,你的问题是,你是喂子模型的局部视图。 因此,当局部视图渲染它不知道,这是一个更大的模型的一部分,并不会产生正确的名称属性。

如果你坚持使用局部模板,而不是编辑模板,那么我建议只透过模型的泛音,然后有每个部分做Model.Whatever.Foo,它会产生正确的名称属性绑定。



Answer 4:

尝试使用EditorTemplates而不是局部模板http://coding-in.net/asp-net-mvc-3-how-to-use-editortemplates/ 。



Answer 5:

@Html.Partial("_ReportOptions", Model.Contact, new ViewDataDictionary()
           {
               TemplateInfo = new TemplateInfo()
                   {
                       HtmlFieldPrefix = "Contact"
                   }
           })

)


@Html.Partial("_TransactionSearchFields", Model.SearchCriteria, new  
 ViewDataDictionary()
           {
               TemplateInfo = new TemplateInfo()
                   {
                       HtmlFieldPrefix = "SearchCriteria"
                   }
           })


文章来源: Post a form with multiple partial views