繁体   English   中英

具有部分视图的MVC发布表单返回Null模型

[英]MVC Posting Form with Partial views returns Null Model

我一直在阅读同一个问题的多个帖子,似乎共识是使用子模型对象和编辑器模板。 我没有重构我的代码来执行此操作,我仍然在帖子上返回null模型。 我无法弄清楚我哪里出错了。 这是我的概念证明代码:

控制器:

[HttpPost]
    public ActionResult CreateNewMatter(NewMatterModel model)
    {
        WorkflowRepository repo = new WorkflowRepository();
        repo.SaveNewMatterWorkflow(model.NewMatterIndex.ClientCode, model.NewMatterIndex.ClientName, model.NewMatterIndex.MatterCode, model.NewMatterIndex.MatterName);

        return View();
    }

主要观点:

 @model NBI_Flow.Web.Models.ActionModels.NewMatterModel @{ ViewBag.Title = "Create New Matter"; } <div class="screen-container"> @using (Html.BeginForm("CreateNewMatter", "Action", FormMethod.Post, new { enctype = "multipart/form-data" })) { <div id="top-control-panel"> <div id="button-row"> <input type="button" id="home-button" value="Home" onclick="location.href = '@Url.Action("Index", "Home")'; return false;" /> <input type="submit" id="save-button" value="Save" /> <input type="button" id="delete-button" value="Delete" onclick="location.href = '@Url.Action("Index", "Home")'; return false;" /> <input type="button" id="submit-button" value="Submit" onclick="saveNewMatter();" /> </div> <div id="status-row"> <div class="status-block"> <label><span>Request Number:</span>013603</label><br /> <label><span>Request Status:</span>01. Draft</label><br /> <label><span>Client #:</span>27619</label> </div> <div class="status-block"> <label><span>Request Type:</span>Existing Client</label><br /> <label><span>Created On:</span>02/29/2016 09:43:10 AM</label><br /> <label><span>Client Name:</span>Greenfield Partner LLC</label> </div> <div class="status-block"> <label><span>Primary Billing Partner:</span></label><br /> <label><span>Created By:</span>Brian Legg</label><br /> <label><span>BABAC Partner:</span></label> </div> </div> </div> @Html.Hidden("SuccessUrl", Url.Action("Index", "Home")) <div id="new-matter-container"> <ul> <li><a href="#tab0" id="_tab0">Intro</a></li> <li><a href="#tab1" id="_tab1">Matter Details</a></li> <li><a href="#tab2" id="_tab2">BABAC</a></li> <li id="tab3tab"><a href="#tab3" id="_tab3">Client Relationship</a></li> <li><a href="#tab4" id="_tab4">Risk Management</a></li> <li><a href="#tab5" id="_tab5">Relevant Parties/Conflicts</a></li> <li><a href="#tab6" id="_tab6">Attachments</a></li> <li><a href="#tab7" id="_tab7">Comments</a></li> <li><a href="#tab8" id="_tab8">Audit</a></li> <li><a href="#tab9" id="_tab9">Copy Request</a></li> <li><a href="#tab10" id="_tab10">Proxies</a></li> </ul> <div id="tab0"> @Html.EditorFor(model => model.NewMatterIndex) </div> <div id="tab1"> @Html.Partial("_MatterDetails") </div> <div id="tab2"> @Html.Partial("_BABAC") </div> <div id="tab3"> @Html.Partial("_ClientRelationship") </div> <div id="tab4"> @Html.Partial("_RiskManagement") </div> <div id="tab5"> @Html.Partial("_RelevantParties") </div> <div id="tab6"> @Html.Partial("_Attachments") </div> <div id="tab7"> @Html.Partial("_Comments") </div> <div id="tab8"> @Html.Partial("_Audit") </div> <div id="tab9"> @Html.Partial("_CopyRequest") </div> <div id="tab10"> @Html.Partial("_Proxies") </div> </div> } </div> 

我知道那里有很多偏见,但我只关心第一个EditorFor。 一旦它工作,我将其余部分转换为EditorTemplates。

EditorTemplate(部分):

 @model NBI_Flow.Web.Models.ActionModels.NewMatterIndex <div id="intro-section"> <label>Requesting Attorney:</label> <select id="attorney-list"> <option value="0">Select...</option> <option value="1">Abramowitz, Laurie</option> <option value="2">Adivari, Heather</option> <option value="3">Adler, Sara</option> <option value="4">Ainsztein, Zachary</option> <option value="5">Allardyce, Aaron L</option> <option value="6">Alten, Klaus</option> <option value="7">Alvarado, Daniela</option> <option value="8">Alyonycheva, Tatiana N</option> </select> <br /><br /> <label>Please enter the matter name:</label> <input type="text" id="matterName" /> <br /><br /> @* 100% throw away code *@ <label>Please enter the client code:</label> @*<input type="text" id="clientCode" />*@ @Html.TextBoxFor(m => Model.ClientCode) .......... 

这是我试图发布的“Model.ClientCode”。 当我点击提交按钮时,我发布的模型如下所示:

在此输入图像描述

任何帮助是极大的赞赏。 如果我遗漏了一些重要的数据,请告诉我。 谢谢!

永远不需要使用编辑器模板。 我不确定你在哪里得到这个建议,但应该采取一些盐。 问题的核心归结为分配给输入/选择/等的name属性。 元素以及模型绑定器期望该名称在POST上的内容。

对于此处的示例,要绑定ClientCode ,modelbinder需要一个名为NewMatterIndex.ClientCode的post值。 如果它是其他任何东西,例如ClientCode ,那么modelbinder将丢弃该值。

现在,在处理partials(编辑器模板是一种形式)时,它都是关于上下文的。 在某种程度上,上下文是该部分的模型,更重要的是, 不是主视图的模型。 因此,例如,如果将Model.NewMatterIndex传递给partial作为模型,那么现在就是Razor在渲染部分时所具有的所有上下文。 结果,如果你做了类似的事情:

@Html.EditorFor(m => m.ClientCode)

在部分内部,生成的name属性将只是ClientCode ,而不是NewMatterIndex.ClientCode

编辑器模板仅在EditorFor维护某些父上下文方面是部分解决方案。 当你打电话的时候:

@Html.EditorFor(m => m.NewMatterIndex)

它将使用NewMatterIndex.正确地为每个内部渲染的输入添加NewMatterIndex. 这并不保证名称永远是正确的,因为可能存在其他问题。 但是,在这个特定情况下,它将解决问题。 您仍然遇到问题的原因可能是由于编辑器模板中的拼写错误。 你有:

@Html.EditorFor(m => Model.ClientCode)

而那应该是:

@Html.EditorFor(m => m.ClientCode)

它们看起来很相似,但实际上意味着非常不同。 此外,虽然您的问题解决了这一特定属性,但似乎您既为所有其他输入手动创建HTML, 未分配任何名称属性。 没有名称,该值甚至不会被发布,更不用说绑定任何东西了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM