2010-12-11 39 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> 
    <% } %> 

然而,更新必須手動這樣的,這似乎不必要的複雜。我發現菲爾哈克(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,只是將View綁定到對象似乎已經足夠了,所以我只需要將它保存在數據庫中...但它不適用於我。返回的Week對象似乎並不是同一個發送到視圖的對象,它的任務集合中沒有任何項目,例如

那麼爲什麼不能「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

好吧,我可以試試,我沒有立即看到如何將麥e差異(屬性在視圖中正確顯示,這不是問題,只是更新不起作用)。行動方法呢?應該如何正確更新? (正如我剛纔提到的,當前一個不正確,編譯器將不允許int值timeSegment.Hours作爲UpdateMethod()中的TModel。 – Anders 2010-12-11 15:41:24

+0

@Anders Svensson:嘗試更新星期實例:'UpdateModel(week)' – 2010-12-12 00:23:48

+0

謝謝,改爲a而不是foreach幫助我現在可以使用它,但我仍然無法以簡單的方式更新模型。請參閱上面的更新。任何想法爲何無法使用? – Anders 2010-12-12 21:53:04