2010-12-11 35 views
1

Comment mettre à jour un modèle complexe? J'ai la vue suivante:Mettre à jour un modèle complexe dans 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> 

Et j'ai essayé la mise à jour comme d'habitude appeler juste UpdataModel sur l'objet modèle: UpdateModel (semaine); Mais cela n'a pas fonctionné. J'ai donc lu quelque chose sur la nécessité de mettre à jour chaque propriété séparément dans des modèles complexes, et j'ai essayé de l'adapter à ma situation. Voici ma tentative dans le contrôleur:

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

Mais cela n'a pas fonctionné non plus. Cela semble fonctionner si la propriété est une chaîne, mais c'est un int, et le compilateur se plaint qu'il doit être un type de référence pour être utilisé comme TModel.

Je ne sais pas si c'est la voie à suivre, j'ai juste besoin de comprendre comment mettre à jour un modèle de type complexe comme celui-ci. Cela ne peut pas être trop rare, donc il doit y avoir une méthode standard, mais je ne peux pas le comprendre ...

Des idées?

MISE À JOUR:

Les travaux suivants:

méthode d'action:

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

Vue:

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

Cependant, la mise à jour doit être manuel comme celui-ci, ce qui semble inutilement complexe. J'ai trouvé un message par Phil Haack (http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx) qui semble suggérer cela devrait être possible de le faire d'une manière, comme plus simple ceci:

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

à savoir simplement recevoir la semaine comme paramètre pour la méthode (dans l'exemple de Haacks, il ne semble même pas qu'il doive appeler UpdateModel, juste avoir la vue liée aux objets semble être assez, donc je ne devrais l'enregistrer que dans la base de données ... Mais cela ne fonctionne pas pour moi.L'objet Semaine qui est retourné ne semble pas être le même que celui envoyé à la vue, il n'a aucun élément dans ses collections de tâches, par exemple

« t ce travail?

Répondre

1

essayez avec for au lieu de 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

d'accord, je pourrais essayer. Je ne vois pas comment cela va immédiatement mak e différence (les propriétés s'affichent correctement dans la vue, ce n'est pas un problème, c'est juste la mise à jour qui ne fonctionne pas). Qu'en est-il de la méthode d'action? Comment cela devrait-il être mis à jour correctement? (Comme je l'ai mentionné, l'actuel n'est pas correct, le compilateur ne permettra pas la valeur int timeSegment.Hours comme TModel dans UpdateMethod(). – Anders

+0

@Anders Svensson: Essayez de mettre à jour l'instance de la semaine: 'UpdateModel (week)' –

+0

Merci , en changeant pour un pour foreach aidé, je peux le faire fonctionner maintenant, je ne suis pas encore capable de mettre à jour le modèle d'une manière simple.Voir ma mise à jour ci-dessus.Les idées pour lesquelles cela ne fonctionne pas? – Anders