如果选择其他行,则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