2011-01-17 4 views
0

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

Ошибка:

The model item passed into the dictionary is of type 'Mdt.ScenarioDBModels.Scenario', but this dictionary requires a model item of type 'Mdt.ScenarioDBModels.Person'.

что меня смущает то, что, если вы посмотрите на конкретной линии, я получаю Person. Итак, основываясь на этом сообщении, он говорит мне, что моя ценность скорее всего равна нулю, а ASP.NET «отступает» к объекту «Сценарий».

Из-за всего этого я решил, что делаю что-то неправильное в том, как я публикую все свои данные (их много), но я застрял в том, что бы это было.

Разъяснения

Я отправляю с помощью 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

Что вам нужно уточнить: как вы публикуете действие контроллера индекса (AJAX, форма, что-то еще)? Что такое действие «Сохранить»? Какую модель она передает? –

+0

@Darin Dimitrov - Обновляется с информацией. – JasCav

+0

@ Darin Dimitrov - я обновил сообщение, чтобы показать, как я создаю сценарий с помощью метода Action (после публикации). Все эти данные являются технически частью сценария ... просто имеет смысл разделить его с точки зрения данных, поскольку существует так много разных данных. (Мой пример немного надуманный - я не показываю все.) Когда я сохраняю, я сохраняю только сценарий (который теперь должен содержать всю информацию о данных). Это вообще помогает? – JasCav

ответ

0

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

return View(scenario); 

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

+0

Наверное, я немного смущен вашим ответом. Я думал, что я только называю «Сохранить» в сценарии, потому что я пытался сохранить все вместе (AKA, если я обновляю сценарий, я обновляю все в хранилище). Как передать отдельные части? (Прошу прощения, если это глупый вопрос о последующих действиях ... Я просто не уверен, что получаю то, что вы говорите.) – JasCav

Смежные вопросы