Я не уверен, правильно ли я публикую несколько частичных страниц из своего приложения 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);
}