如何解决如果选择其他行,则POST数据模型为空-MVC C#
我遇到了一个问题,如果用户选择除第一行之外的任何其他行,则数据POST将返回为空。仅当用户选择第一行时,数据才会显示在POST中。
仅当我使用FormCollection返回数据时,它才有效。
我在做什么错了?
OrderHistory.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" />
}
}
OrderHistory控制器
[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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。