2009-07-11 1 views
0

ASP.NET MVC 응용 프로그램 내에서 Linq를 SQL에 사용하고 있습니다. 모델은 Options 테이블에 대한 외래 키 링크가있는 Decisions 테이블로 구성됩니다 (한 가지 결정, 많은 옵션). 따라서 Model을 통해 Decision.Options 속성을 통해 Options 컬렉션에 액세스 할 수 있습니다. 내 사용자가 다른 Decision 속성을 업데이트하는 것과는 다른보기에서 Decision의 Options 컬렉션을 업데이트 할 수있게하려고합니다. Decision 객체를 업데이트하기 위해 Options 컬렉션을 다시 컨트롤러로 전달하는 가장 좋은 방법은 무엇입니까? 여기에 코드입니다 :ASP.NET 모델 바인더 자식 테이블 업데이트 질문

컨트롤러는 옵션에 대한 의사 결정 모델 보냅니다보기 :

사용자가 수정 제출에 대한 내보기 페이지가 바로 옵션의 이름 필드를 나열
// 
    // GET /Decisions/Options/5 
    [Authorize] 
    public ActionResult Options(int id) 
    { 
     Decision decision = decisionRepository.GetDecision(id); 
     return View(decision); 
    } 

:

<% using (Html.BeginForm()) 
{%> 
    <div id="answers"> 
     <table> 
     <% int i = 0; %> 
     <% foreach (var item in Model.Options) 
      { i += 1; 
     %> 
      <tr> 
       <td> 
        <label>Option #<%= i%>:&nbsp;&nbsp;</label> 
        <%= Html.TextBox("Option.Name", item.Name)%> 
       </td> 
      </tr> 

     <% } %> 
     </table> 

     <input type="submit" name="button" value="Back" /> 
     <input type="submit" name="button" value="Next" /> 
    </div> 
    <% } %> 

을 여기에 POST 옵션 동작에 대한 컨트롤러 코드입니다.

 // POST /Decisions/Options/4 
    [AcceptVerbs(HttpVerbs.Post), Authorize] 
    public ActionResult Options(int id, string button, Decision d) 
    { 
     Decision decision = decisionRepository.GetDecision(id); 

     if (decision == null) 
      return View("NotFound"); 

     if (button == "Back") 
     { 
      return RedirectToAction("Edit", new { id = decision.DecisionID }); 
     } 

     //Update the options in the decision model    
     //TODO: What's the best way to update the Decision.Options parameter? 

     //Save options and move on to factors 
     UpdateModel(decision); 
     decisionRepository.Save(); 
     return RedirectToAction("Factors", new { id = decision.DecisionID }); 
    } 

POST 동작 옵션에 대한 이온, 옵션 항목의 컬렉션을 다시 전달하는 가장 좋은 방법은 무엇입니까?

Save 메서드를 호출하기 전에 FormCollection을 직접 사용하여 Decision.Options에 할당 할 EntitySet으로 변환 해 보았습니다. 위 코드는 Decision 객체가 전달되었지만 Options 컬렉션은 항상 null이므로 내 주석이 달린 TODO입니다.

Decision 개체를 직접 편집하는 데 사용하도록되어 있지만 모델 바인더 또는 FormCollection을 사용하여 모델에서 자식 테이블을 업데이트하는 데 문제가 있습니다. 어떤 도움이라도 대단히 감사합니다!

답변

1

잠재적 인 옵션이 많으므로 각 입력을 다른 입력과 구별해야합니다. 그들 모두에게 같은 이름을 부여 할 수는 없습니다. 대신

: 사용

<%= Html.TextBox("Option.Name", item.Name)%> 

시도 :

<%= Html.TextBox("Option[" + i + "].Name", item.Name)%> 

그런 다음 액션의 매개 변수 중 하나와 같은 옵션 배열을 가지고있다.

공공 ActionResult 옵션 (INT의 ID, 문자열 버튼, 의사 결정 D, 옵션 [] 옵션) { ... }

그럼 당신은 당신이 연결에 의사 결정에 제공된 옵션이 필요 할 수 있습니다.

항목에서 Hanselman의 blog 항목을 참조하십시오.

+0

감사! 배열이 0 기반이어야한다는 것을 기억하고 나서 Action 메서드에서 옵션 배열을 마침내 얻을 수있었습니다! 나는 그것들을 하나에서 시작했다. 다시 한 번 감사드립니다! – kwgainey