2010-12-11 12 views
1

Wie kann ich ein komplexes Modell aktualisieren? Ich habe die folgende Ansicht:Update komplexes Modell in 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> 

Und ich versuchte Update wie gewohnt nur UpdataModel auf dem Modellobjekt aufrufen: Updatemodel (Woche); Aber das hat nicht funktioniert. Also habe ich gelesen, dass ich jede Eigenschaft in komplexen Modellen separat aktualisieren muss und habe versucht, sie an meine Situation anzupassen. Hier ist mein Versuch, in dem Controller:

[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(); 
     //} 
    } 

Aber das hat nicht funktioniert entweder. Es scheint zu funktionieren, wenn die Eigenschaft eine Zeichenkette ist, aber dies ist ein int, und der Compiler beschwert sich, dass es ein Referenztyp sein muss, der als TModel verwendet werden soll.

Ich weiß nicht, ob dies der richtige Weg ist, ich muss nur verstehen, wie man ein komplexes Modell wie dieses aktualisieren kann. Das kann nicht zu ungewöhnlich sein, also muss es eine Standardmethode geben, aber ich kann es nicht herausfinden ...

Irgendwelche Ideen?

UPDATE:

Die folgenden Werke:

Aktionsmethode:

[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(); 
     } 
    } 

Ausblick:

<% 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> 
    <% } %> 

jedoch die Aktualisierung manuell so zu sein hat, was unnötig komplex erscheint. Ich fand einen Beitrag von Phil Haack (http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx), die dies sollte vorzuschlagen scheint möglich sein, auf eine einfachere Art und Weise zu tun, wie folgt aus:

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

D.h. einfach die Week als Parameter für die Methode erhalten (im Beispiel von Haacks scheint er nicht einmal UpdateModel aufzurufen, nur die an die Objekte gebundene Ansicht scheint ausreichend zu sein, also müsste ich sie nur in der Datenbank speichern ... Aber es funktioniert nicht für mich.Das Week-Objekt, das zurückgegeben wird, scheint nicht das selbe zu sein, das an die Ansicht gesendet wird, es hat keine Elemente in seinen Tasksammlungen, zB

Also warum nicht? ‚t diese Arbeit?

Antwort

1

versuchen mit for statt 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

Ordnung, ich könnte versuchen, dass. ich nicht sofort sehen, wie das mak wird e ein Unterschied (die Eigenschaften werden in der Ansicht korrekt angezeigt, das ist kein Problem, es ist nur das Update, das nicht funktioniert). Was ist mit der Aktionsmethode? Wie sollte das aussehen, um richtig zu aktualisieren? (Wie ich bereits erwähnt habe, der aktuelle ist nicht korrekt, der Compiler erlaubt nicht den int-Wert timeSegment.Hours als TModel in UpdateMethod(). – Anders

+0

@Anders Svensson: Versuchen Sie, die Woche Instanz zu aktualisieren: 'UpdateModel (Woche)' –

+0

Danke Ich kann es jetzt funktionieren lassen, ich bin nur noch nicht in der Lage, das Modell auf eine einfache Art zu aktualisieren. Siehe mein Update oben. Irgendwelche Ideen, warum das nicht funktioniert? – Anders