Post 带有标签助手和 dotnet 核心的控制器列表

Post a list to a controller with tag-helpers and dotnet core

我看到过关于此问题的类似问题,但标签助手对我的问题进行了调整。我想要发生的是用户可以从不同的座位级别中进行选择,从该级别中选择一些座位,然后当他们提交一堆对象时,其中包含有关每个级别所选择的座位数量的详细信息(以及其他一些详细信息,省略b/c我还没有到那里)转到控制器,然后控制器会做一些逻辑...

我有我的模型:

public class PerformanceDetailsViewModel
    {
        public int Id { get; set; }
        public string ZoneDescription { get; set; }
        public string ShowName { get; set; }
        public DateTime ShowDateTime { get; set; }
        public string VenueName { get; set; }
        public decimal Price { get; set; }
        public int NumberOfTickets { get; set; }
        public List<SelectListItem> NumberSeatSelect { get; } = new List<SelectListItem>
        {
            new SelectListItem { Value = "0", Text = "0" },
            new SelectListItem { Value = "1", Text = "1" },
            new SelectListItem { Value = "2", Text = "2" },
            new SelectListItem { Value = "3", Text = "3" },
            new SelectListItem { Value = "4", Text = "4" }
        };
    }

我的看法:

@model List<PerformanceDetailsViewModel>

<h1>@Model.Select(x => x.ShowName).First()</h1>
<h4>@Model.Select(x => x.ShowDateTime).First()</h4>
<h5>@Model.Select(x => x.VenueName).First()</h5>
<hr />
<div class="row">
    <div class="col-3">

    </div>
    <div class="col-3">
        Choose Number of Tickets
    </div>
</div>
<form asp-controller="PerformanceDetails" asp-action="AddToCart" method="post">

    @for (var i = 0; i < Model.Count; i++)
    {
        <div class="row">
            <div class="col-3">
                @Model[i].ZoneDescription <br />
                @Model[i].Price.ToString("C")
            </div>

            <select asp-for="@Model[i].NumberOfTickets" asp-items="Model[i].NumberSeatSelect"></select>
        </div>
        <hr />
    }
    <button type="submit" class="btn btn-sm btn-primary">Add to cart</button>
</form>

我的控制器:

public void AddToCart(PerformanceDetailsViewModel numTickets)
        {
            var text = numTickets;
        }

问题是 - 我错过了什么?表单呈现良好,并且包含数据。我在不同的地方看到了使用 for 循环而不是 foreach 的例子,所以我这样做了,但我的模型仍然是空的,即使我检查了 Chrome 开发工具并看到了表格确实有数据。

此外,我不知道是否要对控制器方法使用 List<>

另一个问题是 select asp-for 部分,因为它扩展为一堆 html,但我不知道这对模型有何影响,因为每个部分都有一个独特的名称与型号名称不匹配...

我做错了什么?我需要修复什么?

控制器:

public void AddToCart(PerformanceDetailsViewModel numTickets)
{
   ViewData["text"] = numTickets;

   return View();
}

并在您的视图中使用 ViewData

回答我自己的问题:您不能使用 asp-for="@Model[i].NumberOfTickets",因为标签助手会将其转换为 [0].NumberOfTickets,这是模型绑定器正在寻找的名称,并且永远不会匹配。所以你根本不能使用 asp-for,你必须将它分解为 id="@Model[i].NumberOfTickets" name="NumberOfTickets",模型绑定器会喜欢它。然后你的数据就会通过。

此外,必须更新模型才能获得单个名称项的列表,因此将 public int NumberOfTickets { get; set; } 转换为 public List<int> NumberOfTickets { get; set; }