Я не публикую данные правильно? - PullRequest
0 голосов
/ 17 января 2011

Я не уверен, правильно ли я публикую несколько частичных страниц из своего приложения ASP.NET MVC.

На своем сайте я загружаю несколько частичных страниц и отображаю их на вкладках пользовательского интерфейса jQuery.Вот пример того, как это выглядит на моей 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>

Все мои частичные представления строго типизированы для единственной версии каждого из этихобъекты (Сценарий, Персона и Адрес в данном случае).

Пользователь вводит данные, которые он или она хочет изменить, а затем сохраняет данные.Когда я публикую эти данные, я делаю это в моем контроллере:

[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».

Что меня смущает, так это то, что, если вы посмотрите на конкретную строку, я получаю Person.Итак, основываясь на этом посте, он говорит, что мое значение, скорее всего, равно нулю, а 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 голосов
/ 19 января 2011

Оказывается, я не обновлял модель должным образом.Ответ можно найти здесь: Почему обновление объекта работает только одним конкретным способом?

0 голосов
/ 17 января 2011

Проблема в том, что в вашем методе Save вы всегда передаете scenario в качестве модели представления, независимо от того, в каком контексте был вызван этот метод (сценарий, человек или адрес):

return View(scenario);

, в то время как ваш Person.ascx ожидает Person в качестве модели представления. Таким образом, вам нужно передать лицо в представление на случай, если вы пытаетесь обновить частичное лицо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...