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; }
我看到过关于此问题的类似问题,但标签助手对我的问题进行了调整。我想要发生的是用户可以从不同的座位级别中进行选择,从该级别中选择一些座位,然后当他们提交一堆对象时,其中包含有关每个级别所选择的座位数量的详细信息(以及其他一些详细信息,省略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; }