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
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
Comment obtenez-vous les 'résultats' à la méthode UpdateModel? – Lazarus
Supposé que c'était un processus automatique. Ce n'est pas le cas? – Sergio