我遇到了一个问题,如果用户选择了除第一行之外的任何其他行,则数据POST返回为空。只有当用户选择第一行时,数据才会显示在POST中。
只有当我使用FormCollection返回数据时,它才有效。
我做错了什么?
订单历史.CSHTML
@model DiningOrder.Models.JSON.OrderHistory
@for (int i = 0; i < Model.orders.Count(); i++)
{
@using (Html.BeginForm("Reorder", "OrderHistory", FormMethod.Post))
{
@Html.AntiForgeryToken()
@Html.HiddenFor(x => Model.orders[i].id)
<input type="submit" value="REORDER" class="btn btn-dark btn-lg btn-block" />
}
}
订单历史控制器
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Reorder(OrderHistory model)
{
return View();
}
从您发布的视图中,每行都有一个表单!因此,每当你发回服务器时,你只会发送一个订单ID。
如果您只需要订单ID就可以重新订购,那么您应该创建Reorder
方法,只接受订单ID:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Reorder(int orderId)
{
return View();
}
如果你希望用户能够选择多个订单并重新订购,那么你可能会稍微改变一下视图模型:
// I am totally guessing
public class OrderHistoryViewModel
{
public IEnumerable<OrderViewModel> Orders { get; set; }
}
public class OrderViewModel
{
public int OrderId { get; set; }
public bool SelectedToReorder { get; set; }
}
然后在[HttpGet]
方法上初始化订单列表:
public class OrderHistoryController : Controller
{
public ActionResult Index()
{
var vm = new OrderHistoryViewModel
{
Orders = // Get the orders from your persistence layer
};
return View(vm);
}
}
然后在index.cshtml
视图中,您只需要一个:,而不是放置多个表单
@model OrderHistoryViewModel
<h3>Order History</h3>
@using (Html.BeginForm("reorder", "orderhistory", new { area = "" }, FormMethod.Post, null)
{
@Html.AntiForgeryToken()
for (int i = 0; i < Model.Orders.Count(); i++)
{
@Html.HiddenFor(x => x.Orders[i].Id)
@Html.CheckboxFor(x => x.Orders[i].SelectedToReorder)
}
<button type="submit">Re-order</button>
}
最后,在[HttpPost]
方法中,您可以过滤用户选择的订单并处理您的逻辑:
public class OrderHistoryController : Controller
{
public ActionResult Index()
{
var vm = new OrderHistoryViewModel
{
Orders = // Get the orders from your persistence layer
};
return View(vm);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Reorder(OrderHistoryViewModel model)
{
if (ModelState.IsValid)
{
var selectedOrderIds = model.Orders
.Where(x => x.SelectedToReorder == true)
.ToArray();
// Keep going
return RedirectToAction ...;
}
return View...;
}
}
此处没有任何表和行。你的代码创建了几个单独的表单,当你提交时,你只提交了其中一个表单,你必须将提交的表单视为FormCollection