Asp.net MVC avec Entity, en utilisant jquery pour transmettre des données dans List. Ne marche pas

Edit 3 / Final

Ceci est un exemple pleinement fonctionnel utilisant .NET MVC, Jquery et les modèles d’éditeur. https://www.dropbox.com/s/t4yxbhkuowyd7va/exerciseTest.rar

Modifier 2

Ça marche enfin! Merci à la réponse ci-dessous. Il semble que je devais changer la ligne partielle NewAnswerRow:

 

Merci !

Modifier 1:

J’ai suivi ce guide: http://www.techiesweb.net/asp-net-mvc3-dynamically-added-form-fields-model-binding/

La partie amusante est que, lorsque j’utilise sa source, cela fonctionne comme il se doit. Mais c’est presque exactement la même chose.

Poste originale

Tout d’abord, merci de lire ce message et d’être prêt à vous aider. Je suis sidérée. Laissez-moi essayer d’expliquer ma situation. J’essaie de créer un nouvel exercice avec une liste de réponses. Ces réponses sont créées à la volée avec Jquery. Je lis ces réponses avec EditorTemplates. Tout fonctionne sauf que, lorsque je crée de nouveaux champs “Réponse” et que je clique sur “Publier”, mon contrôleur ne peut voir aucune donnée (réponse). La chose étrange est. Lorsque j’utilise des annotations de données telles que [requirejs] dans, par exemple, une propriété de réponse. Je vais être redirigé vers l’index. Quand je réessaye, mon modèle n’est plus vide.

En gros, ma question est la suivante: comment puis-je intégrer ces réponses dans ma liste?

J’ai créé un nouveau projet pour que vous soyez plus clair et précis.

J’ai 2 modèles,

  • Exercice

  • Réponses

ExerciceModel class

 [Table("Exercise")] public class ExerciseModel { [Key] public int ExerciseId { get; set; } public ssortingng Question { get; set; } public IList Answers { get; set; } } 

C’est fondamentalement une classe simple. Comme vous pouvez le voir les gars. Il y a une liste avec des réponses.

AnswerModel

 [Table("Answer")] public class AnswerModel { [Key] public int AnswerId { get; set; } public ssortingng Answer { get; set; } } 

Une classe AnswerModel simple avec un ID et une réponse.

Mon contrôleur

 public class ExerciseController : Controller { private readonly DataContext db = new DataContext(); // // GET: /Exercise/ public ActionResult Index() { var exercise = new ExerciseModel(); exercise.Answers = GetAnswers(); return View(exercise); } [HttpPost] public ActionResult Index(ExerciseModel exercisemodel) { //need to implement interaction with database (not yet) testing phase. return View("PostedData", exercisemodel); } public ActionResult NewAnswersRow(int id) { var answers = new AnswerModel { AnswerId = id }; return View("partial/NewAnswersRow", answers); } private List GetAnswers() { var answerslist = new List(); answerslist.Add(new AnswerModel { AnswerId = 1, Answer = "This is a hardcoded answer"}); //normally db.Answers (for testing purposes) return answerslist; } } 

Mon index

 @model exerciseTest.Models.ExerciseModel @using (Html.BeginForm()) { 
@Html.LabelFor(model => model.Question)
@Html.EditorFor(model => model.Question) @Html.ValidationMessageFor(model => model.Question)
@Html.EditorFor(m => m.Answers)

} $(function () { $("#btnAdd").click(function (e) { var itemIndex = $("#container input.iHidden").length; console.debug("itemIndex : "+itemIndex); e.preventDefault(); $.get("@Url.Action("NewAnswersRow", "Exercise")/"+itemIndex,function(data){ $("#container").append(data); }); }); });

Mon modèle d’éditeur de AnswerModel

 @model exerciseTest.Models.AnswerModel @{ Layout = null; }    @Html.HiddenFor(x => x.AnswerId, new { @class="iHidden" }) @Html.TextBoxFor(x => x.Answer)   

Mon NewAnswersRow.cshtml pour la création de nouvelles lignes à la volée avec Jquery (voir Index pour la partie de code)

 @model exerciseTest.Models.AnswerModel @{ Layout = null; }       

Et ma vue “postedData” à des fins de test

 @model exerciseTest.Models.ExerciseModel 

Posted data is

@foreach (var item in Model.Answers) {

@item.Answer

}

J’essaie de faire en sorte que cette chose fonctionne. Je dois dire que, dans environ 5 ans, je n’ai jamais demandé quelque chose ici sur StackOverflow parce que je pouvais trouver des réponses. Mais cette fois, j’ai besoin de votre aide.

Merci !

Vous avez un bogue dans votre NewAnswersRow partial view . Name et l’ Id sont les mêmes dans votre code HTML, mais c’est le nom qui est transmis dans un message de formulaire. Si vous regardez ce que fait MVC , l’atsortingbut name du champ de texte de réponse est Answers[x].Answer , tandis que l’ Id est Answers[x].AnswerText .

Changez donc votre name='Answers[@Model.AnswerId].AnswerText' en name='Answers[@Model.AnswerId].Answer' afin qu’il corresponde à ce que MVC attend. Travaillé pour moi!