数据不在控制器方法中 - MVC
Data is not going in controller method - MVC
我是 MVC 的新手,我正在尝试编辑一行并通过 jQuery 和 AJAX 将编辑后的数据发送到控制器方法,当我点击编辑时,特定行变成文本框并且save
ActionLink
出现而不是 edit
,但是当我保存它时它给了我一个例外。
这是我的 jQuery/AJAX:
@model IEnumerable<OTESSystem.Models.tbl_HolidayList>
@{
ViewBag.Title = "Index";
}
<script src="~/Scripts/jquery-1.8.2.min.js"></script>
<script src="~/Scripts/jquery-ui-1.8.24.min.js"></script>
<link href="~/Content/themes/base/jquery-ui.css" rel="stylesheet" />
<script type="text/javascript">
$(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'); //
}
});
});
});
</script>
chtml代码:
<div id="details">
<table>
<tr>
@*<th>
@Html.Label("ID")
</th>*@
<th>
@Html.Label("Name")
</th>
<th>
@Html.Label("Description")
</th>
<th>
@Html.Label("Date")
</th>
<th></th>
</tr>
@foreach (var item in Model)
{
if (Convert.ToDateTime(item.Holiday_date).Year.ToString() == DateTime.Now.Year.ToString())
{
<tr>
@* <td>
@Html.TextBoxFor(modelItem => item.Holiday_Id, new { style = "display: none; width:170px; height:15px" })
<div class="displaytext">
@Html.DisplayFor(modelItem => item.Holiday_Id)
</div>
</td>*@
<td>
@Html.TextBoxFor(modelItem => item.Holiday_Name, new { style = "display: none; width:170px; height:15px" })
<div class="displaytext">
@Html.DisplayFor(modelItem => item.Holiday_Name)
</div>
</td>
<td>
@Html.TextBoxFor(modelItem => item.Holiday_Description, new { style = "display: none; width:170px; height:15px" })
<div class="displaytext">
@Html.DisplayFor(modelItem => item.Holiday_Description)
</div>
</td>
<td>
@Html.TextBoxFor(modelItem => item.Holiday_date, new { style = "display: none; width:170px; height:15px" })
<div class="displaytext">
@Html.DisplayFor(modelItem => item.Holiday_date)
</div>
</td>
<td>
@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" } )
</td>
</tr>
}
}
</table>
</div>
控制器方法代码:
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<System.DateTime> Holiday_date { get; set; }
}
}
你能告诉我为什么会出现这个异常吗??
你之前问过类似的问题,主要问题还是和之前一样的问题。您不能将 foreach
循环与 @Html.TextBoxFor
等一起使用。您需要使用 for 循环并对表达式进行索引:
问题一:
例如
@for (int i = 0; i < Model.Count(); i++)
{
[snip]
<td>
@Html.TextBoxFor(m => Model[i].Holiday_Name, new { style = "display: none; width:170px; height:15px" })
<div class="displaytext">
@Html.DisplayFor(m => Model[i].Holiday_Name)
</div>
</td>
[snip]
}
问题是传递给 TextBoxFor
的表达式树需要知道索引值才能正确生成索引名称。 foreach
提供的局部变量不知道它在其父集合中的什么位置。
问题2
另一个问题是您只想将一行发送回 Edit
方法。这与上述建议不一致。
尝试只序列化单行,然后元素的不正确命名实际上应该对您有利:
var data = $(this).closest('tr').serialize();
其他问题
您的页面当前包含 IEnumerable<OTESSystem.Models.tbl_HolidayList>
个项目集合。
您通常会使用 for
循环渲染它们(不是针对每个 - 请参见问题 1)。然后,您将 post 返回整个页面,这样您的 edit
方法也应该使用 IEnumerable<OTESSystem.Models.tbl_HolidayList>
例如
public ActionResult Edit(IEnumerable<tbl_HolidayList> tbl_holidaylist)
{
foreach( var holiday in tbl_holidaylist)
{
//save changes
}
}
基本上,您的页面中发生了两件相互冲突的事情。您需要决定是遵循标准 MVC 实践还是反对它们:)
这对我有用
<script type="text/javascript">
$(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 () {;
//alert("hello");
var tr = $(this).parents('tr:first');
//alert(tr);
var hid = tr.find("#hdnid").val();
var HName = tr.find("#txtname").val();
var Hdesc = tr.find("#txtdesc").val();
var date = tr.find("#txtdate").val();
tr.find("#hdnid").text(hid);
tr.find("#txtname").text(HName);
tr.find("#txtdesc").text(Hdesc);
tr.find("#txtdate").text(date);
toggleEditability.call(this);
//tr.find('.edit-mode, .display-mode').toggle();
//alert(hid);
//alert(HName);
//alert(Hdesc);
//alert(date);
var dataToSend = {
Holiday_Id: hid,
Holiday_Name: HName,
Holiday_Description : Hdesc,
Holiday_date: date
}
var url = '@Url.Action("Edit", "Holiday")';
//alert("b4 ajax");
$.ajax({
url: '@Url.Action("Edit", "Holiday")',
type: "Post",
data: dataToSend,
//dataType: "html",
success: function (data) {
alert("saved");
},
error: function () {
alert("error");
}
});
});
});
</script>
我是 MVC 的新手,我正在尝试编辑一行并通过 jQuery 和 AJAX 将编辑后的数据发送到控制器方法,当我点击编辑时,特定行变成文本框并且save
ActionLink
出现而不是 edit
,但是当我保存它时它给了我一个例外。
这是我的 jQuery/AJAX:
@model IEnumerable<OTESSystem.Models.tbl_HolidayList>
@{
ViewBag.Title = "Index";
}
<script src="~/Scripts/jquery-1.8.2.min.js"></script>
<script src="~/Scripts/jquery-ui-1.8.24.min.js"></script>
<link href="~/Content/themes/base/jquery-ui.css" rel="stylesheet" />
<script type="text/javascript">
$(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'); //
}
});
});
});
</script>
chtml代码:
<div id="details">
<table>
<tr>
@*<th>
@Html.Label("ID")
</th>*@
<th>
@Html.Label("Name")
</th>
<th>
@Html.Label("Description")
</th>
<th>
@Html.Label("Date")
</th>
<th></th>
</tr>
@foreach (var item in Model)
{
if (Convert.ToDateTime(item.Holiday_date).Year.ToString() == DateTime.Now.Year.ToString())
{
<tr>
@* <td>
@Html.TextBoxFor(modelItem => item.Holiday_Id, new { style = "display: none; width:170px; height:15px" })
<div class="displaytext">
@Html.DisplayFor(modelItem => item.Holiday_Id)
</div>
</td>*@
<td>
@Html.TextBoxFor(modelItem => item.Holiday_Name, new { style = "display: none; width:170px; height:15px" })
<div class="displaytext">
@Html.DisplayFor(modelItem => item.Holiday_Name)
</div>
</td>
<td>
@Html.TextBoxFor(modelItem => item.Holiday_Description, new { style = "display: none; width:170px; height:15px" })
<div class="displaytext">
@Html.DisplayFor(modelItem => item.Holiday_Description)
</div>
</td>
<td>
@Html.TextBoxFor(modelItem => item.Holiday_date, new { style = "display: none; width:170px; height:15px" })
<div class="displaytext">
@Html.DisplayFor(modelItem => item.Holiday_date)
</div>
</td>
<td>
@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" } )
</td>
</tr>
}
}
</table>
</div>
控制器方法代码:
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<System.DateTime> Holiday_date { get; set; }
}
}
你能告诉我为什么会出现这个异常吗??
你之前问过类似的问题,主要问题还是和之前一样的问题。您不能将 foreach
循环与 @Html.TextBoxFor
等一起使用。您需要使用 for 循环并对表达式进行索引:
问题一:
例如
@for (int i = 0; i < Model.Count(); i++)
{
[snip]
<td>
@Html.TextBoxFor(m => Model[i].Holiday_Name, new { style = "display: none; width:170px; height:15px" })
<div class="displaytext">
@Html.DisplayFor(m => Model[i].Holiday_Name)
</div>
</td>
[snip]
}
问题是传递给 TextBoxFor
的表达式树需要知道索引值才能正确生成索引名称。 foreach
提供的局部变量不知道它在其父集合中的什么位置。
问题2
另一个问题是您只想将一行发送回 Edit
方法。这与上述建议不一致。
尝试只序列化单行,然后元素的不正确命名实际上应该对您有利:
var data = $(this).closest('tr').serialize();
其他问题
您的页面当前包含 IEnumerable<OTESSystem.Models.tbl_HolidayList>
个项目集合。
您通常会使用 for
循环渲染它们(不是针对每个 - 请参见问题 1)。然后,您将 post 返回整个页面,这样您的 edit
方法也应该使用 IEnumerable<OTESSystem.Models.tbl_HolidayList>
例如
public ActionResult Edit(IEnumerable<tbl_HolidayList> tbl_holidaylist)
{
foreach( var holiday in tbl_holidaylist)
{
//save changes
}
}
基本上,您的页面中发生了两件相互冲突的事情。您需要决定是遵循标准 MVC 实践还是反对它们:)
这对我有用
<script type="text/javascript">
$(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 () {;
//alert("hello");
var tr = $(this).parents('tr:first');
//alert(tr);
var hid = tr.find("#hdnid").val();
var HName = tr.find("#txtname").val();
var Hdesc = tr.find("#txtdesc").val();
var date = tr.find("#txtdate").val();
tr.find("#hdnid").text(hid);
tr.find("#txtname").text(HName);
tr.find("#txtdesc").text(Hdesc);
tr.find("#txtdate").text(date);
toggleEditability.call(this);
//tr.find('.edit-mode, .display-mode').toggle();
//alert(hid);
//alert(HName);
//alert(Hdesc);
//alert(date);
var dataToSend = {
Holiday_Id: hid,
Holiday_Name: HName,
Holiday_Description : Hdesc,
Holiday_date: date
}
var url = '@Url.Action("Edit", "Holiday")';
//alert("b4 ajax");
$.ajax({
url: '@Url.Action("Edit", "Holiday")',
type: "Post",
data: dataToSend,
//dataType: "html",
success: function (data) {
alert("saved");
},
error: function () {
alert("error");
}
});
});
});
</script>