我一直在阅读关于同一问题的多篇文章,似乎一致认为是将子模型对象与编辑器模板一起使用。我没有重构我的代码来执行此操作,而且我仍然在发布时返回一个空模型。我不知道我哪里出错了。这是我的概念验证代码:
Controller :
[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
属性。元素以及模型绑定(bind)器期望该名称在 POST 上的内容。
对于此处的示例,要绑定(bind) ClientCode
,modelbinder 需要一个名为 NewMatterIndex.ClientCode
的 post 值。如果是其他任何东西,例如 ClientCode
,则模型绑定(bind)器将丢弃该值。
现在,在处理部分(编辑器模板的一种形式)时,一切都与上下文有关。在部分 View 中,上下文是该部分 View 的模型,重要的是,不是主视图的模型。因此,例如,如果您将 Model.NewMatterIndex
作为模型传递给局部,那么这就是 Razor 在呈现该局部时所具有的所有上下文。因此,如果您随后执行以下操作:
@Html.EditorFor(m => m.ClientCode)
在该部分中,生成的名称属性将只是 ClientCode
,而不是它需要的 NewMatterIndex.ClientCode
。
编辑器模板只是在 EditorFor
维护一些父上下文方面的部分解决方案。当你打电话时:
@Html.EditorFor(m => m.NewMatterIndex)
它将正确地为每个呈现在内部的输入加上 NewMatterIndex.
前缀。这并不能保证名称总是正确的,因为可能存在其他问题。但是,在这种特定情况下,它会解决问题。您仍然遇到问题的原因可能是您的编辑器模板中有错字。你有:
@Html.EditorFor(m => Model.ClientCode)
而应该是:
@Html.EditorFor(m => m.ClientCode)
它们看起来很相似,但实际上含义却截然不同。此外,虽然您的问题是围绕这个特定属性解决的,但您似乎都在为所有其他输入手动创建 HTML 并且没有为它们分配任何名称属性。没有名称,值甚至不会被发布,更不用说绑定(bind)到任何东西了。
关于c# - 具有部分 View 的 MVC 发布表单返回空模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35848850/