2011-01-17 7 views
0

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> 

는, 및 주소).

사용자는 변경하려는 데이터를 입력 한 다음 데이터를 저장합니다. 내가 데이터를 게시 할 때, 나는 내 컨트롤러에이 일을하고있다 :이 얼마나 올바른 완전히 확실하지 않다

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

당신이 특정 라인에서 보면, 내가 사람을 얻고 있다는 것이다. 그래서,이 게시물을 기반으로, 그것은 내 값이 가장 가능성이 높습니다 그리고 ASP.NET "시나리오"개체로 "떨어지고있다".

이 모든 것 때문에 모든 데이터를 게시하는 방법이 올바르지 않다고 생각했지만 (그 중 많은 부분이 있음) 나는 그렇게 될 것입니다.

따라 정정

내가 아약스를 통해 게시하고있다. 다음은 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, 폼, 다른 뭔가)에 게시하고 있습니까? 'Save' 액션은 무엇을하고 있습니까? 보기에 어떤 모델이 전달됩니까? –

+0

@Darin Dimitrov - 정보로 업데이트되었습니다. – JasCav

+0

@Darin Dimitrov - 게시물 작성 후 Action 메서드를 통해 시나리오를 작성하는 방법을 보여주기 위해 내 게시물을 업데이트했습니다. 모든 데이터는 기술적으로 시나리오의 일부입니다. 데이터가 너무 많아 데이터 관점에서 데이터를 분리하는 것이 합리적입니다. (예를 들어 약간 인위적으로 - 모든 것을 보여주지는 않습니다.) 내가 저장하면 지금은 모든 데이터 정보를 포함해야하는 시나리오 만 저장합니다. 그게 전혀 도움이 되나요? – JasCav

답변

0

문제는 당신 Save 방법에 항상보기 모델로 scenario을 전달하는 것입니다,이 메소드가 호출 된 문맥에 상관없이 (시나리오, 사람 또는 주소) :

return View(scenario); 

귀하의 Person.ascx 부분 모델은 뷰어 모델로 Person을 기대하고 있습니다. 따라서 사람을 부분적으로 업데이트하려는 경우에 대비하여 사람을보기로 전달해야합니다.

+0

나는 너의 대답에 조금 혼란스러워한다. 모든 것을 함께 저장하려고했기 때문에 시나리오에서 "저장"이라고 만 부른다고 생각했습니다. (시나리오를 업데이트하면 백업 저장소의 모든 내용을 업데이트합니다.) 개별 부품을 어떻게 전달합니까? (이것이 바보 같은 후속 질문 인 경우 사과드립니다 ... 나는 당신이 말하는 것을 얻을지 확신하지 못합니다.) – JasCav

관련 문제