Post 循环内的表单数据
Post Form Data from Within a Loop
我想在单击列表中的复选框时提交表单数据。目前我正在使用不起作用的 onclick 事件,因为它发送一个获取请求,我需要它发送一个 post 请求。
如何从循环中 post 我的控制器方法的两个参数。
编辑 从下面的评论中我需要使用 AJAX 因为我打算留在同一页面上。我错误地认为 post 请求可以做到这一点。如果有人愿意用 AJAX 为我指明正确的方向,将不胜感激。
代码如下:
@for (var i = 0; i < Model.Count(); i++)
{
<tr>
<td>
@Html.DisplayFor(modelItem => modelItem[i].InvoiceID)
</td>
<td>
@Html.DisplayFor(modelItem => modelItem[i].Description)
</td>
<td>
@Html.DisplayFor(modelItem => modelItem[i].InvoiceDate)
</td>
<td>
@Html.DisplayFor(modelItem => modelItem[i].DueDate)
</td>
<td>
<input asp-for="@Model[i].Paid" onclick="location.href='@Url.Action("UpdatePaidStatus", "Billing", new { invoiceID = Model[i].InvoiceID, paid = Model[i].Paid })'" />
</td>
</tr>
}
您可以使用 jQuery 创建自己的处理程序以从表单中收集所有数据,然后手动对您的控制器执行 post 或使用 Ajax.BeginForm。
一些相关的答案已经 posted here and here.
根据您的评论,您想要 post 行中模型的 invoiceID
以及指示复选框状态的值。把你html改成
<input type="checkbox" class="status" value="@Model[i].InvoiceID />
并添加以下脚本
var url = "@Url.Action("UpdatePaidStatus", "Billing");
$('.status').click(function() {
var id = $(this).val();
var isPaid = $(this).is(':checked');
$.post(url, { id: id, isPaid : isPaid }, function(data) {
if (data) {
// do something based on the data you return
} else {
// oops
}
}).fail(function() {
// oops
});
});
这会post到下面的方法
[HttpPost]
public JsonResult UpdatePaidStatus(int ID, bool isPaid)
{
// save something
return Json(true); // or return Json(null) is it fails?
}
您没有指明当 ajax 调用成功或失败时您可能会发生什么,但是例如您可以更新 DOM 以显示指示成功或失败的消息。
旁注:ajax 在这里可能真的没有必要。如果您在每一行中包含 Model[i].InvoiceID
的隐藏输入并执行正常表单提交至
public ActionResult UpdatePaidStatus(IList<yourmodel> model)
那么您的模型将与 InvoiceID
和 Paid
属性正确绑定,因此您可以一次更新集合中的所有项目。
我想在单击列表中的复选框时提交表单数据。目前我正在使用不起作用的 onclick 事件,因为它发送一个获取请求,我需要它发送一个 post 请求。
如何从循环中 post 我的控制器方法的两个参数。
编辑 从下面的评论中我需要使用 AJAX 因为我打算留在同一页面上。我错误地认为 post 请求可以做到这一点。如果有人愿意用 AJAX 为我指明正确的方向,将不胜感激。
代码如下:
@for (var i = 0; i < Model.Count(); i++)
{
<tr>
<td>
@Html.DisplayFor(modelItem => modelItem[i].InvoiceID)
</td>
<td>
@Html.DisplayFor(modelItem => modelItem[i].Description)
</td>
<td>
@Html.DisplayFor(modelItem => modelItem[i].InvoiceDate)
</td>
<td>
@Html.DisplayFor(modelItem => modelItem[i].DueDate)
</td>
<td>
<input asp-for="@Model[i].Paid" onclick="location.href='@Url.Action("UpdatePaidStatus", "Billing", new { invoiceID = Model[i].InvoiceID, paid = Model[i].Paid })'" />
</td>
</tr>
}
您可以使用 jQuery 创建自己的处理程序以从表单中收集所有数据,然后手动对您的控制器执行 post 或使用 Ajax.BeginForm。 一些相关的答案已经 posted here and here.
根据您的评论,您想要 post 行中模型的 invoiceID
以及指示复选框状态的值。把你html改成
<input type="checkbox" class="status" value="@Model[i].InvoiceID />
并添加以下脚本
var url = "@Url.Action("UpdatePaidStatus", "Billing");
$('.status').click(function() {
var id = $(this).val();
var isPaid = $(this).is(':checked');
$.post(url, { id: id, isPaid : isPaid }, function(data) {
if (data) {
// do something based on the data you return
} else {
// oops
}
}).fail(function() {
// oops
});
});
这会post到下面的方法
[HttpPost]
public JsonResult UpdatePaidStatus(int ID, bool isPaid)
{
// save something
return Json(true); // or return Json(null) is it fails?
}
您没有指明当 ajax 调用成功或失败时您可能会发生什么,但是例如您可以更新 DOM 以显示指示成功或失败的消息。
旁注:ajax 在这里可能真的没有必要。如果您在每一行中包含 Model[i].InvoiceID
的隐藏输入并执行正常表单提交至
public ActionResult UpdatePaidStatus(IList<yourmodel> model)
那么您的模型将与 InvoiceID
和 Paid
属性正确绑定,因此您可以一次更新集合中的所有项目。