Asp.net MVC with Entity,使用jquery将数据传递到List。 不起作用

编辑3 /决赛

这是使用.NET MVC,Jquery和编辑器模板的完整工作示例。 https://www.dropbox.com/s/t4yxbhkuowyd7va/exerciseTest.rar

编辑2

它终于奏效了! 感谢下面的答案。 看来我需要更改NewAnswerRow部分行:

 

谢谢 !

编辑1:

我遵循了这个指南: http : //www.techiesweb.net/asp-net-mvc3-dynamically-added-form-fields-model-binding/

有趣的是,当我使用他的来源时,它的工作方式应该如此。 但它几乎完全一样。

原帖

首先感谢您阅读此消息,并愿意提供帮助。 我大吃一惊。 让我试着解释一下我的情况。 我正在尝试创建一个包含答案列表的新练习。 这些答案是使用Jquery随时创建的。 我正在使用EditorTemplates阅读这些答案。 一切正常,但是当我创建新的“答案”字段并按“发布”时我的控制器无法看到任何数据(答案)。 奇怪的是。 当我使用[required]等数据注释时,例如answer属性。 我正被重定向到索引。 当我再次尝试时,我的模型不再是空的。

所以基本上我的问题是,我怎样才能将这些答案放入我的清单?

我已经为你们创建了一个新项目,使其更加清晰和具体。

我有2个型号,

  • 行使

  • 答案

ExerciseModel类

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

它基本上是一个简单的类。 你们可以看到。 有一个带答案的列表。

AnswerModel

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

一个简单的AnswerModel类,带有Id和Answer。

我的控制器

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

我的索引视图

 @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); }); }); });

我的AnswerModel的编辑器模板

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

我的NewAnswersRow.cshtml用于使用Jquery动态创建新行(请参阅代码部分的索引)

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

我的’postedData’视图用于测试目的

 @model exerciseTest.Models.ExerciseModel 

Posted data is

@foreach (var item in Model.Answers) {

@item.Answer

}

我想让这件事情发挥作用。 我必须说,在5年的时间里,我从来没有在StackOverflow上问过什么,因为我可以找到答案。 但这一次,我需要你的帮助。

谢谢 !

您的NewAnswersRow partial view存在错误。 您的html中的NameId是相同的,但它是在表单post中传递的名称。 如果你看一下MVC正在做什么,答案文本字段的name属性是Answers[x].Answer ,而IdAnswers[x].AnswerText

所以将你的name='Answers[@Model.AnswerId].AnswerText'更改为name='Answers[@Model.AnswerId].Answer'以便它匹配MVC所期望的。 为我工作!