2010-12-11 4 views
1

어떻게하면 복잡한 모델을 업데이트 할 수 있습니까? 나는 다음과 같은보기가 있습니다ASP.NET MVC 2에서 복잡한 모델을 업데이트 하시겠습니까?

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Tidrapportering.Models.Week>" %> 
<% using (Html.BeginForm()) 
    {%> 
<%: Html.ValidationSummary(true) %> 
<fieldset> 
    <legend>Fields</legend> 
    <table width="100%"> 
     <% foreach (var task in Model.Tasks) 
      { %> 
     <tr> 
      <td> 
       <%: task.Customer.CustomerName %> 
      </td> 
      <td> 
       <%: task.TaskName %> 
      </td> 
      <td> 
       <% foreach (var ts in task.TimeSegments) 
        { %> 
       <%= Html.TextBox("Hours", ts.Hours)%> 
       <% } %> 
      </td> 
     </tr> 
     <% } %> 
    </table> 
    <p> 
     <input type="submit" value="Spara tid" /> 
    </p> 
</fieldset> 
<% } %> 
<div> 
    <%: Html.ActionLink("Back to List", "Index") %> 
</div> 

을 그리고 난 그냥 모델 객체에 UpdataModel를 호출 평소와 같이 업데이 트를 시도 : UpdateModel (주); 하지만 그건 효과가 없었습니다. 그래서 복잡한 모델에서 각 속성을 개별적으로 업데이트해야하는 것에 대해 읽고 상황에 적응하려고했습니다.

[HttpPost] 
    public ActionResult EditTasks(int id, FormCollection collection) 
    { 
     //try 
     //{ 
      Week week = _model.GetWeek(id); 


      foreach (var task in week.Tasks) 
      { 
       foreach (var timeSegment in task.TimeSegments) 
       {       
        UpdateModel(timeSegment.Hours, "Hours"); 
       } 
      } 


      //UpdateModel(week); 
      _model.Save(); 
      return RedirectToAction("Index"); 
     //} 
     //catch 
     //{ 
     // return View(); 
     //} 
    } 

하지만 그 중 하나가 작동하지 않았다 다음은 컨트롤러의 내 시도이다. 속성이 문자열이지만 int이고 컴파일러가 TModel로 사용할 참조 형식이어야한다고 불평하면 작동하는 것 같습니다.

이 방법을 사용할지 모르겠다. 이런 복잡한 유형의 모델을 업데이트하는 방법을 알아야한다. 이것은 너무 드문 수 없기 때문에 몇 가지 표준 방법이 있어야하지만, 나는 그것을 알아낼 수 없습니다 ...

어떤 아이디어?

UPDATE :

다음 작품 :

의 조치 방법 :

[HttpPost] 
    public ActionResult EditTasks(int id, FormCollection collection) 
    { 
     try 
     { 
      Week week = _model.GetWeek(id); 
      for (int i = 0; i < week.TaskList.Count; i++) 
      { 
       var task = week.TaskList[i]; 
       for (int j = 0; j < task.TimeSegmentList.Count; j++) 
       { 
        int hours = Int32.Parse(collection["TaskList[" + i + "].TimeSegmentList[" + j + "].Hours"]); 
        week.TaskList[i].TimeSegmentList[j].Hours = hours; 
       } 
      } 

      //UpdateModel(week); 
      _model.Save(); 
      return RedirectToAction("Index"); 
     } 
     catch 
     { 
      return View(); 
     } 
    } 

보기 :

<% for (int i = 0; i < Model.TaskList.Count; i++) 
     { 
      var task = Model.TaskList[i]; 
    %> 
    <tr> 
     <td> 
      <%: task.Customer.CustomerName %> 
     </td> 
     <td> 
      <%: task.TaskName %> 
     </td> 
     <% for (int j = 0; j < task.TimeSegmentList.Count; j++) 
      { %> 
     <td> 
      <%: Html.TextBoxFor(model => model.TaskList[i].TimeSegmentList[j].Hours, new { @class = "hourInput" })%> 
     </td> 
     <% } %> 
    </tr> 
    <% } %> 

그러나, 갱신이 같은 매뉴얼이어야한다, 불필요하게 복잡해 보입니다. 나는 이런 식으로,이 간단한 방법으로 할 수 있어야한다 제안하는 것 같다 필 Haack (http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx)에 의해 게시물 발견

[HttpPost] 
    public ActionResult EditTasks(Week week) 
    { 
     try 
     { 
      UpdateModel(week); 
      _model.Save(); 
      return RedirectToAction("Index"); 
     } 
     catch 
     { 
      return View(); 
     } 
    } 

을 즉 단순히 메서드에 대한 매개 변수로 Week를 받는다. (Haacks 예제에서 UpdateModel을 호출해야하는 것조차 보이지 않는다. 뷰를 객체에 바인딩하는 것으로 충분하기 때문에 데이터베이스에 저장하면된다. ... 그러나 그것은 나를 위해 작동하지 않습니다. 반환 된 Week 개체는보기로 보낸 것과 같지 않습니다. 즉, 작업 모음에 항목이 없습니다. 예 :

그런데 왜 doesn 't이 작동합니까?

답변

1

내가 그것을 시도 할 수, for 대신 foreach

<fieldset> 
    <legend>Fields</legend> 
    <table width="100%"> 
     <% for (int i = 0; i < Model.Tasks.Count; i++) 
      { 
       var task = Model.Tasks[i]; 
     %> 
     <tr> 
      <td> 
       <%: task.Customer.CustomerName %> 
      </td> 
      <td> 
       <%: task.TaskName %> 
      </td> 
      <td> 
       <% for (int j = 0; j < task.TimeSegments.Count; j++) 
        { %> 
       <%= Html.TextBox("Model.Tasks["+i+"].TimeSegments["+j+"].Hours")%> 
       <% } %> 
      </td> 
     </tr> 
     <% } %> 
    </table> 
    <p> 
     <input type="submit" value="Spara tid" /> 
    </p> 
</fieldset> 
+0

좋아하여보십시오. 내가 바로 그 막'방식을 볼 수 없습니다 차이점 (보기에서 속성이 올바르게 표시되지만 문제가되지는 않습니다. 단지 작동하지 않는 업데이트 일뿐입니다). 액션 메소드는 어떻습니까? 어떻게 제대로 업데이트 되야합니까? (앞에서 언급했듯이 컴파일러는 UpdateMethod()에서 TModel로 int 값 timeSegment.Hours를 허용하지 않습니다. – Anders

+0

@Anders Svensson : 주 인스턴스 업데이트 : UpdateModel (week) –

+0

감사합니다. for foreach 대신 for로 변경하면 도움이되었지만, 지금은 작동하도록 만들 수 있습니다. 간단하게 모델을 업데이트 할 수 없습니다. 위의 업데이트를 참조하십시오. 이것이 작동하지 않는 이유는 무엇입니까? – Anders

관련 문제