如果选择了其他行,POST数据模型为空-MVC C#



我遇到了一个问题,如果用户选择了除第一行之外的任何其他行,则数据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