我不确定我是否正在从ASP.NET MVC应用程序中正确发布多个部分页面。
在我的网站上,我加载了许多部分页面并在jQuery UI选项卡中显示它们。以下是我在 Index.aspx 页面(设计示例)中的示例:
<div id="tabScenario"><% Html.RenderPartial("Scenario", Model); %></div>
<div id="tabPerson"><% Html.RenderPartial("Person", Model.People.FirstOrDefault()); %></div>
<div id="tabAddress"><% Html.RenderPartial("Address", Model.People.FirstOrDefault().Addresses.FirstOrDefault()); %></div>
我的部分视图都是强类型的,每个对象的单个版本(在这种情况下为Scenario,Person和Address)。
用户输入他或她想要更改的数据,然后保存数据。当我发布这些数据时,我在我的控制器中执行此操作:
[HttpPost]
[Header("Setup Scenario")]
public ActionResult Index(Scenario scenario, Person person, Address address, string submitButton)
{
// Update the scenario with all the information that belongs to it.
scenario.Person = person;
scenario.Person.Address = address;
// Determine whether to just save or to save and submit.
switch (submitButton)
{
case "Save":
return Save(scenario, true);
case "Save As...":
return Save(scenario, false);
case "Submit":
return Submit(scenario);
default:
return View();
}
}
我不完全确定这是多么正确,因为当我显示我刚刚在下一个视图上发布的信息时,我在线收到以下运行时错误:
<div id="tabPerson"><% Html.RenderPartial("Person", Model.People.FirstOrDefault()); %></div>
错误:
模型项传入 字典是类型 'Mdt.ScenarioDBModels.Scenario',但是 这本词典需要一个模型项目 类型'Mdt.ScenarioDBModels.Person'。
令我困惑的是,如果你看一下特定的一行,我就会得到人。因此,基于这篇文章,它告诉我我的值很可能为null,ASP.NET正在“回退”到Scenario对象。
由于这一切,我认为我在发布所有数据的方式上做了一些不正确的事情(有很多数据),但我会陷入困境。
澄清
我通过Ajax发帖。这是BeginForm语句。
<% using (Ajax.BeginForm("Index", "Scenario", new AjaxOptions { HttpMethod = "Post", OnSuccess = "scenarioSubmitSuccess" }, new { id = "scenarioForm" }))
{ %>
// My Index.aspx
<% } %>
Save方法基本上是尝试将模型保存到后备存储(在本例中为数据库)。这是方法:
/// <summary>
/// Save a the scenario.
/// </summary>
/// <param name="scenario">The scenario to save to the database.</param>
/// <param name="overwrite">True if the existing scenario should be updated in the database.</param>
/// <returns></returns>
private ActionResult Save(Scenario scenario, bool overwrite)
{
if (ModelState.IsValid && TryUpdateModel(scenario, "Scenario"))
{
ScenarioDBEntities entities = ObjectContextFactory.GetScenarioDBEntities();
ScenarioRepository scenarioRepository = new ScenarioRepository(entities);
if (overwrite)
{
scenarioRepository.Update(scenario);
}
else
{
scenarioRepository.Add(scenario);
}
entities.SaveChanges();
}
return View(scenario);
}
答案 0 :(得分:0)
问题在于,在Save
方法中,您始终将scenario
作为视图模型传递,无论在何种上下文中调用此方法(方案,人员或地址):
return View(scenario);
当您的Person.ascx
部分期望Person
作为视图模型时。因此,如果您尝试更新部分人,则需要将此人传递给视图。
答案 1 :(得分:0)
原来,我没有正确更新模型。答案可以在这里找到:Why does updating an object only work one particular way?