2009-10-14 5 views
3

Question rapide concernant la mise à jour d'une liste d'éléments dans asp.net mvc.ASP.NET MVC Mise à jour d'une liste d'objets sur un formulaire? (liaison de modèle à une liste)

Fondamentalement, j'ai une méthode d'action d'édition qui renvoie une collection d'objets (incidemment, la structure de la table ressemble à ceci: 'testID, assetID, Result' - une table de liens).

Je souhaite fondamentalement que ces éléments soient affichés les uns après les autres dans un formulaire et puissent être édités. Le formulaire doit poster et le modelbinder fait sa magie. Mais, ce n'est pas si facile.

J'ai parcouru le net et il semble que la majorité des informations sur ce sujet semble être un peu obsolète. Je suis tombé sur this post, qui n'a pas été mis à jour depuis longtemps, et this one qui semble suggérer que vous ne devriez pas vous lier à une liste déjà existante pour la mise à jour, et qu'il y a des problèmes lorsque vous travaillez avec EF ou Linq vers Sql (que je suis).

Existe-t-il un moyen facile de réaliser ce que je veux? L'état de la liaison du modèle de liste a-t-il changé dans la version finale?

MISE À JOUR - Un peu plus près ...

Voici ma méthode Edit:

public ActionResult EditSurveyResults(Guid id) 
    { 
     var results = surveyRepository.GetSurveyResults(id); 
     return PartialView("EditSurveyResults", results); 
    } 

Et ma forme:

<div id="editSurveyResults"> 
<h2> 
    EditSurveryResults</h2> 

<%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %> 
<% using (Html.BeginForm()) 
    {%> 
<fieldset> 
    <legend>Results</legend> 
    <% int i = 0; foreach (var result in Model) 
    { %> 

    <input type="hidden" name='results[<%= i %>].TestID' value='<%= result.TestID %>' /> 
    <input type="hidden" name='results[<%= i %>].AssetID' value='<%= result.AssetID %>' /> 
    <p> 
     <%= result.Task.TaskName%> 
    </p> 
    <p> 
     <label for="Result"> 
      Result:</label> 
     <input type="text" name='results[<%= i %>].Result' value='<%= result.Result %>' /> 
     <%= Html.ValidationMessage("Result", "*")%> 
    </p> 

    <% i++; } %> 
    <p> 
     <input type="submit" value="Save" /> 
    </p> 
</fieldset> 
<% } %> 

Et ma méthode Modifier POST:

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult EditSurveyResults(Guid id, IList<SurveyTestResult> results) 
    { 
     var oldValues = surveyRepository.GetSurveyResults(id); 

     if (ModelState.IsValid) 
     { 
      UpdateModel(oldValues); 
      surveyRepository.Save(); 
      return Content("Done"); 
     } 
     else 
      return PartialView("EditSurveyResults"); 
    } 

Ce n'est pas complet bien sûr, mais il ne met pas à jour quoi que ce soit dans son état actuel. Est-ce que je manque un tour ici? les résultats sont peuplés avec les entités mises à jour donc je ne sais pas pourquoi il ne met pas à jour ...

MISE À JOUR 2: Donc, je commence à penser que le classeur modèle ne peut pas faire ce genre de choses. J'ai donc décidé de faire les choses d'une manière plus hacker. Si quelqu'un peut repérer un problème avec ceci alors s'il vous plaît faites le moi savoir. FYI - ce formulaire sera saisi avec AJAX donc je ne retourne pas une vue, plutôt un message simple. Voici le nouveau code:

IList<SurveyTestResult> oldValues = surveyRepository.GetSurveyResults(id).ToList(); 
      foreach (var result in SurveyTestResult) 
      { 
       //SurveyTestResult is the IList that comes down from the form.      
       SurveyTestResult thisone = oldValues.Single(p => p.AssetID == result.AssetID && 
        p.TestID == result.TestID); 
       //update the old entity with the result from the new one 
       thisone.Result = result.Result; 
      } 

Et puis je STOCKER sur mon dépôt.

Merci à l'avance

+0

Je suis maintenant à l'étape où je reçois le Model Binder pour revenir avec une liste d'entités mises à jour mais UpdateModel(), lorsqu'il est passé avec la collection d'origine, ne met pas à jour quoi que ce soit. – Sergio

+0

Comment obtenez-vous les 'résultats' à la méthode UpdateModel? – Lazarus

+0

Supposé que c'était un processus automatique. Ce n'est pas le cas? – Sergio

Répondre

5

Une chose que je remarque que vous n'êtes pas rendu <input type="hidden" name='results.Index' value='<%= i %>' /> comme phil Haacks article est obligatoire mentions.

Passer à un Modelbinder différent pourrait aussi faire l'affaire. J'utilise le classeur modèle DataAnnotations et avec cela je ne dois pas générer .Index champs lors de la liaison à List.

+0

ouais j'ai lu qui a été déprécié dans RC1 ou quelque chose. Pensez qu'il est mentionné dans le deuxième lien que j'ai posté (dans les commentaires). Je ne sais pas si j'ai le temps de jouer avec de nouvelles reliures. Je voudrais, mais c'est un autre morceau de choses à apprendre qui ne me prendra pas sans doute des âges ... – Sergio

+0

cela a résolu mon problème grâce – DavidJones

Questions connexes