我如何发布MVC中的项目列表

我有一个简单的forms,其中的项目列表,我想发布他们的控制器,但有趣的是我只是不能。 除了列表之外,其他所有事情都能正确地进 我检查了瓢虫中的ajax调用和post的值是这样的:

Answers[0].IsMissing False Answers[0].Text Ja Answers[0].Value 0 Answers[1].IsMissing False Answers[1].Text Nein Answers[1].Value 1 Id 1cd14b08-ce3b-4671-8cf8-1bcf69f12b2d Name Ja/Nein 

我有一个AnwserScheme类具有以下属性:

 public string Name { get; set; } public bool IsMissing { get; set; } public List<AnswerDisplayItem> Answers { get; set; } public AnswerScheme() { Answers = new List<AnswerDisplayItem>(); } 

我有这个观点代码:

 @for (int i = 0; i < Model.Answers.Count; i++) { <tr> <td> @Html.HiddenFor(model => Model.Answers[i].IsMissing) @Html.TextBoxFor(model => Model.Answers[i].Value, new { @class = "inputValue" }) </td> <td> @Html.TextBoxFor(model => Model.Answers[i].Text, new { @class = "inputAnswer" }) </td> <td> <span class="span-delete" data-answer-scheme-id="@Model.Id" data-answer-id="@Model.Answers[i].Id" >x</span> </td> </tr> } 

我有这张负责发布的ajax代码:

 $.ajax({ url: "/AnswerScheme/AddAnswer", type: "post", data: $("#formAnswerScheme").serialize(), success: function (data) { console.log(data); $("#divAnswerSchemeContainer").html(data); } }); 

我在控制器中添加了一个答案操作:

 [HttpPost] public PartialViewResult AddAnswer(AnswerScheme answerScheme) { ...some logic comes here } 

所以最后控制器会收到模型,但只有简单的属性,而不是列表。 任何帮助将不胜感激! 干杯。

我希望我能看到更多的类和代码,因为你没有设置正确的东西。

我从你提供的东西中重新创build了一些东西,这是有效的。 我为这个示例创build了一个MVC 3项目。

查看/共享/ _Layout.cshtml

 <!DOCTYPE html> <html> <head> <title>@ViewBag.Title</title> <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" /> <script src="@Url.Content("~/Scripts/jquery-1.7.1.min.js")" type="text/javascript"></script> </head> <body> @RenderBody() </body> </html> 

查看/共享/ _Partial.cshtml

 @model RazorListTest.Models.AnswerScheme <table> @for (int i = 0; i < Model.Answers.Count; i++) { <tr> <td> @Html.HiddenFor(model => Model.Answers[i].IsMissing) @Html.TextBoxFor(model => Model.Answers[i].Value, new { @class = "inputValue" }) </td> <td> @Html.TextBoxFor(model => Model.Answers[i].Text, new { @class = "inputAnswer" }) </td> <td><span class="span-delete" data-answer-scheme-id="@Model.Id" data-answer-id="@Model.Answers[i].Id" >x</span></td> </tr> } </table> 

型号/ AnswerDisplayItem.cs

 using System.Collections.Generic; namespace RazorListTest.Models { public class AnswerDisplayItem { public bool IsMissing { get; set; } public string Text { get; set; } public string Value { get; set; } public string Id { get; set; } } public class AnswerScheme { public List<AnswerDisplayItem> Answers { get; set; } public string Id { get; set; } public AnswerScheme() { Answers = new List<AnswerDisplayItem>(); } } } 

首页/ Index.cshtml

 @model RazorListTest.Models.AnswerScheme @using (Html.BeginForm(null, null, FormMethod.Get, new { name="formAnswerScheme", id = "formAnswerScheme"})) { {Html.RenderPartial("_Partial");} <div> <input type="button" value="Click me" id="btnClick"/> </div> <div id="divAnswerSchemeContainer"> </div> } <script type="text/javascript"> $("#btnClick").click(function () { $.ajax({ url: 'Home/AddAnswer', type: 'POST', dataType: 'json', data: $("#formAnswerScheme").serialize(), async: false, success: function (data) { console.log(data); $("#divAnswerSchemeContainer").html(data); }, error: function (xhr, textStatus, exceptionThrown) { alert(JSON.parse(xhr.responseText)); } }); }); </script> 

控制器/ HomeController.cs

 using System.Collections.Generic; using System.Web.Mvc; using RazorListTest.Models; namespace RazorListTest.Controllers { public class HomeController : Controller { public ActionResult Index() { AnswerScheme a = new AnswerScheme(); a.Id = "1cd14b08-ce3b-4671-8cf8-1bcf69f12b2d"; List<AnswerDisplayItem> adi = new List<AnswerDisplayItem>(); AnswerDisplayItem a1 = new AnswerDisplayItem(); a1.IsMissing = false; a1.Text = "Ja"; a1.Value = "0"; a1.Id = "1234"; AnswerDisplayItem a2 = new AnswerDisplayItem(); a2.IsMissing = false; a2.Text = "Nein"; a2.Value = "1"; a2.Id = "5678"; adi.Add(a1); adi.Add(a2); a.Answers = adi; return View(a); } [HttpPost] public JsonResult AddAnswer(AnswerScheme answerScheme) { return Json("the list is in the Model."); } } } 

问题是与您的文本框和其他input控件的名称/ id属性。 您可以使用编辑器模板来使事情无缝和可重用.. 在这里的另一个例子。

但是,如果你仍然想循环,你的循环必须在这里或这里的例子中看到的东西。

它与TheGeekYouNeed发布的内容几乎完全相同,但是我猜想有些东西只是缺失。 我不知道这可能是什么。

AnswerScheme视图:

 @using System.Web.Mvc.Html @using MetaDataPortal.Models @model AnswerScheme @{ ViewBag.Title = @Model.IsMissing ? "Missing" : "AnswerScheme"; Layout = "~/Views/Shared/_Layout.cshtml"; } @section CssContent{ <link href="../../Content/CSS/AnswerScheme.css" rel="stylesheet" /> } @using (Html.BeginForm("Save", "AnswerScheme", FormMethod.Post, new { id = "formAnswerScheme" })) { <div id="divAnswerSchemeContainer"> @{Html.RenderPartial("_AnswerScheme", Model);} </div> <input type="button" class="clear inputButton" id="buttonAddCode" value="Add @(Model.IsMissing ? "Missing" : "Answer")" /> <input type="submit" value="Save" /> } @section Javascript{ <script type="text/javascript"> $(function () { $("#buttonAddCode").click(function () { $.ajax({ url: "/AnswerScheme/AddAnswer", type: "post", async: false, data: $("#formAnswerScheme").serialize(), success: function (data) { console.log(data); $("#divAnswerSchemeContainer").html(data); } }); return false; }); }); </script> <script type="text/javascript" src="~/Content/JavaScript/AnswerScheme.js"></script> } 

_AnswerScheme partialview

  @model MetaDataPortal.Models.AnswerScheme @Html.HiddenFor(model => model.Id, new { Id = "AnswerSchemeId" }) <ul class="ulGeneralForm"> <li> @Html.LabelFor(model => model.Name, "Name", new { @class = "labelGeneral" }) @Html.TextBoxFor(model => model.Name, Model.Name, new { @class = "textBoxGeneral" }) </li> <li> @Html.Label(@Model.IsMissing ? "Missings" : "Answers", new { @class = "labelGeneral" }) <table class="textualData links downloadList"> <thead> <tr> <th>Value</th> <th> @(Model.IsMissing ? "Missing" : "Answer")</th> <th></th> </tr> </thead> <tbody id="tbodyCodeContainer"> @for (int i = 0; i < Model.Answers.Count; i++) { <tr> <td> @Html.HiddenFor(model => Model.Answers[i].IsMissing) @Html.TextBoxFor(model => Model.Answers[i].Value, new { @class = "inputValue" }) </td> <td> @Html.TextBoxFor(model => Model.Answers[i].Text, new { @class = "inputAnswer" }) </td> <td><span class="span-delete" data-answer-scheme-id="@Model.Id" data-answer-id="@Model.Answers[i].Id" >x</span></td> </tr> } </tbody> </table> </li> </ul> 

AnswerScheme.cs:

  using System; using System.Collections.Generic; using System.Linq; using Opit.Rogatus.DomainObjects; namespace MetaDataPortal.Models { public class AnswerScheme : BaseModel { public string Name { get; set; } public bool IsMissing { get; set; } public List<AnswerDisplayItem> Answers { get; set; } public AnswerScheme() { Answers = new List<AnswerDisplayItem>(); } public AnswerScheme(CodeList codeList, bool isMissing) : this() { Id = codeList.Id; Name = codeList.Name; IsMissing = isMissing; foreach (Code code in codeList.Codes.Where(code => code.Category.IsMissing == isMissing)) { Answers.Add(new AnswerDisplayItem(code)); } } } } 

AnswerDisplayItem.cs:

  using System; using Opit.Rogatus.DomainObjects; namespace MetaDataPortal.Models { public class AnswerDisplayItem { public Guid Id { get; private set; } public short Value { get; private set; } public string Text { get; private set; } public Guid AnswerSchemeId { get; set; } public bool IsMissing { get; private set; } public AnswerDisplayItem() { } public AnswerDisplayItem(Code code) { Id = code.Id; Value = code.Value; Text = code.Category.Name; IsMissing = code.Category.IsMissing; if (code.CodeList == null) return; AnswerSchemeId = code.CodeList.Id; } } } 

和控制器几乎是一样的。

尝试更改控制器参数名称为“answers”或属性名称为AnswerScheme,如果您的文章中的部分控制器应该是收到列表,然后更改types为:

 List<AnswerScheme> answers 

你可以像这样创build模型

  public class ApplicationInfo { public List<ApplicationAccessRoles> ApplAccessRoleInfo { get; set; } } public class ApplicationAccessRoles { public int app_access_role_key { get; set; } public int app_key { get; set; } public string access_role { get; set; } public bool inactive { get; set; } } 

把它放在视图中

  <div class="step-pane" id="step3"> <div class="form-horizontal" style="vertical-align:central;margin-left:150px"> <table id="RolesDetails" cellpadding="0" cellspacing="0" class="data_table"> <tr class="dataheader"> <td class="width5"> &nbsp; @Html.HiddenFor(m => m.app_access_role_key) </td> <td class="width200"> Access Roles Name </td> <td class="width10"> Inactive </td> </tr> @if (Model.ApplAccessRoleInfo.Count!= 0) { var chk = Model.ApplAccessRoleInfo.Count; for (int a = 0; a < Model.ApplAccessRoleInfo.Count; a++) { <tr class="exp_col_header top_border_nil"> @if ((chk - 1) == a) { <td><a href="#" class="gridexpand" rel="1"></a></td> } else { <td></td> } <td> @Html.HiddenFor(m => m.ApplAccessRoleInfo[a].app_access_role_key) @Html.EditorFor(m => m.ApplAccessRoleInfo[a].access_role) </td> <td> @Html.CheckBox("ApplTeamAccessInfo[" + a.ToString() + "].inactive", false, new { @class = "check-box"}) </td> </tr> } } else { <tr class="exp_col_header top_border_nil"> <td> <a href="#" class="gridexpand" rel="1"></a> </td> <td> @*@Html.EditorFor(model => model.access_role)*@ @*@Html.EditorFor(m => m.ApplAccessRoleInfo[0].access_role)*@ @Html.EditorFor(model=>model.access_role) </td> <td> @Html.CheckBoxFor(model => model.inactive) </td> </tr> } </table> </div> </div> 

在控制器中

  var main = (from a in db.mas_app_access_roles where a.app_key == AppInfo.app_key select new ApplicationAccessRoles { app_access_role_key = a.app_access_role_key, access_role = a.access_role, inactive = a.inactive, }).ToList(); access = main; AppInfo.ApplAccessRoleInfo = access; ViewBag.check = access; return View(AppInfo);