我没有正确发布数据吗?

时间:2011-01-17 20:39:15

标签: asp.net-mvc-2

我不确定我是否正在从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);
    }

2 个答案:

答案 0 :(得分:0)

问题在于,在Save方法中,您始终将scenario作为视图模型传递,无论在何种上下文中调用此方法(方案,人员或地址):

return View(scenario);

当您的Person.ascx部分期望Person作为视图模型时。因此,如果您尝试更新部分人,则需要将此人传递给视图。

答案 1 :(得分:0)

原来,我没有正确更新模型。答案可以在这里找到:Why does updating an object only work one particular way?