数据不在控制器方法 – MVC中

我是MVC的新手,我正在尝试编辑一行并通过jQuery和AJAX将编辑后的数据发送到控制器方法,当我点击编辑时,特定行变为文本框并save ActionLink而不是edit ,但是当我保存它时给了我一个例外。 在此处输入图像描述

这是我的jQuery / AJAX:

 @model IEnumerable @{ ViewBag.Title = "Index"; }     $(document).ready(function () { function toggleEditability() { $(this).closest('tr') .find('a.Edit, a.Save, .displayText, input[type=text]') .toggle(); } $('a.Edit').click(toggleEditability); $('a.Save').click(function () { toggleEditability.call(this); var data = $(this).closest('form').serialize(); //var url = $(this).attr('href'); var actionURL = '@Url.Action("Edit", "Holiday")'; $.ajax({ url: actionURL, // Url to send request to data:data, // Send the data to the server type: "POST", // Make it a POST request dataType: "html", // Expect back HTML success: function (html) { $("#dialog-edit").dialog('open'); // } }); }); });  

chtml代码:

 
@**@ @foreach (var item in Model) { if (Convert.ToDateTime(item.Holiday_date).Year.ToString() == DateTime.Now.Year.ToString()) { @* *@ } }
@Html.Label("ID") @Html.Label("Name") @Html.Label("Description") @Html.Label("Date")
@Html.TextBoxFor(modelItem => item.Holiday_Id, new { style = "display: none; width:170px; height:15px" })
@Html.DisplayFor(modelItem => item.Holiday_Id)
@Html.TextBoxFor(modelItem => item.Holiday_Name, new { style = "display: none; width:170px; height:15px" })
@Html.DisplayFor(modelItem => item.Holiday_Name)
@Html.TextBoxFor(modelItem => item.Holiday_Description, new { style = "display: none; width:170px; height:15px" })
@Html.DisplayFor(modelItem => item.Holiday_Description)
@Html.TextBoxFor(modelItem => item.Holiday_date, new { style = "display: none; width:170px; height:15px" })
@Html.DisplayFor(modelItem => item.Holiday_date)
@Html.ActionLink("Edit", "Edit", new { id = item.Holiday_Id }, new { @class = "Edit", Href="#" }) @Html.ActionLink("Save", "Save", new { id = item.Holiday_Id}, new { @class = "Save", Href = "#", style = "display:none" } ) | @Html.ActionLink("Delete", "Delete", new { id = item.Holiday_Id }, new { @class = "lnkDelete" }) @Html.ActionLink("Cancel", "Cancel", new { id = item.Holiday_Id}, new { @class = "Cancel", Href = "#", style = "display:none" } )

控制器方法代码:

  public ActionResult Edit(tbl_HolidayList tbl_holidaylist) { if (ModelState.IsValid) { db.Entry(tbl_holidaylist).State = EntityState.Modified; db.SaveChanges(); TempData["Msg"] = "Data has been updated succeessfully"; return RedirectToAction("Index"); } return PartialView(tbl_holidaylist); } 

tbl_HolidayList.cs

 namespace OTESSystem.Models { using System; using System.Collections.Generic; public partial class tbl_HolidayList { public int Holiday_Id { get; set; } public string Holiday_Name { get; set; } public string Holiday_Description { get; set; } public Nullable Holiday_date { get; set; } } } 

你能告诉我为什么我得到这个例外吗?

你之前问了一个类似的问题,主要问题是和以前一样的问题。 你不能使用带有@Html.TextBoxFor等的foreach循环。你需要使用for循环并对表达式进行索引:

问题1:

例如

 @for (int i = 0; i < Model.Count(); i++) { [snip]  @Html.TextBoxFor(m => Model[i].Holiday_Name, new { style = "display: none; width:170px; height:15px" }) 
@Html.DisplayFor(m => Model[i].Holiday_Name)
[snip] }

问题是传递给TextBoxFor的表达式树需要知道索引值才能正确生成索引名称。 foreach提供的局部变量不知道它在父集合中的位置。

问题2

另一个问题是您只想将单行发送回Edit方法。 这与上述建议不一致。

尝试将单行序列化,然后元素的错误命名实际上对您有利:

  var data = $(this).closest('tr').serialize(); 

其他问题

您的页面当前采用IEnumerable项目集合。 您通常会使用for循环渲染这些(不是每个 – 请参阅问题1)。 然后,您将回发整个页面,以便您的edit方法还应使用IEnumerable

例如

  public ActionResult Edit(IEnumerable tbl_holidaylist) { foreach( var holiday in tbl_holidaylist) { //save changes } } 

基本上,您的页面中有两个相互矛盾的事情。 你需要决定是采用标准的MVC实践还是反对它们:)

这对我有用