c# - 如何在 ASP.NET MVC 应用程序中使用多选?
问题描述
两天前,我试图弄清楚并学习如何在 ASP.NET Core 中构建多选下拉列表,它是从 db 上下文中播种的,并且结果在构造函数中被进一步使用,所以我决定问这个问题。我在任何地方都没有找到如何使用已发布表单中的数据,所以也许你能帮助我。我相信我在控制器中的 POST 操作中犯了一些错误。我不确定我应该如何将发布的数据输入控制器。
我在简单的例子中尝试了各种组合。我现在拥有的最好的是:
ViewModel.cs:
public class ProductViewModel
{
public List<SelectListItem> Products { get; set; }
public int[] ProductIDs { get; set; }
}
索引.cshtml:
<!DOCTYPE html>
<html>
<head>
<title>Aplikacja</title>
<meta charset="utf-8">
<link rel="stylesheet" href="~/dist/allstyles.css" />
</head>
<body>
<form asp-action="Index" method="post">
<input type="hidden" asp-for="Products" />
<div class="form-group">
<label asp-for="Products">Produkty</label>
<select asp-for="ProductIDs" class="form-control" asp-items="ViewBag.Lista"></select>
</div>
<div class="text-center">
<button class="btn btn-primary" type="submit">Save</button>
<a asp-action="Index" class="btn btn-secondary">Cancel</a>
</div>
</form>
//ViewBag tests from controller
@ViewBag.Message //test1, returns 0
@ViewBag.Message2 //test2, returns 0
</body>
</html>
控制器.cs
public class ProductController : Controller
{
private readonly ApplicationDbContext _context; //database context
public ProductController(ApplicationDbContext context)
{
_context = context; //context for controller
}
//GET
public ActionResult Index()
{
ProductViewModel productVM = new ProductViewModel(); //viewmodel instance
PopulateProducts(); //populating dropdown
return View(productVM); //returning viewmodel
}
//POST (I belive that here I have screwed something a lot, I do not understand everything what is going on in this action)
[HttpPost]
public ActionResult Index(ProductViewModel productVM)
{
PopulateProducts();
if (productVM.ProductIDs !=null)
{
List<SelectListItem> selectedItems = productVM.Products.Where(p => productVM.ProductIDs.Contains(int.Parse(p.Value))).ToList();
ViewBag.Message = selectedItems.Count.ToString(); //returns 0
ViewBag.Message2 = productVM.Products.Count.ToString();//returns 0
}
return View(productVM);
}
private void PopulateProducts() //method populating dropdown list
{
var techQuery = from t in _context.Products //getting products context from database
orderby t.Name //sorting by names
select t; //selecting item (??)
if (techQuery != null) //if db context var is not null...
{
ViewBag.Lista = techQuery.Select(n => new SelectListItem { Text = n.Name, Value = n.ProductID.ToString() }); //...creating viewbag that is used for populating dropdown list in view
}
}
}
解决方案
因为selectedItems
,我认为你需要从而ViewBag.Lista
不是检索productVM.Products
。Form
从View
to发帖时Controller
,ProductViewModel.Products
将始终为空。
我建议您尝试使用以下解决方法ViewBag.Lista
。
public ActionResult ProductSelect(ProductViewModel productVM)
{
PopulateProducts();
if (productVM.ProductIDs != null)
{
List<SelectListItem> selectedItems = ((IEnumerable<SelectListItem>)ViewBag.Lista)
.Where(p => productVM.ProductIDs.Contains(int.Parse(p.Value))).ToList();
ViewBag.Message = selectedItems.Count.ToString(); //returns 0
ViewBag.Message2 = ((IEnumerable<SelectListItem>)ViewBag.Lista).Count().ToString();//returns 0
}
return View(productVM);
}
推荐阅读
- jenkins - 重新启动詹金斯管道中的一个阶段以清除现有目录
- laravel-8 - 当我将 laravel 应用程序从 5.0 更新到 8.0 时
- python - 是否可以将数据包发送到 exe 文件?还是控制一个?
- javascript - 在 Typescript 中,为什么我需要在类的构造函数之外声明一个属性,而不像 Javascript 那样我不需要这样做?
- typescript - React Hook Form - Typescript 问题和错误处理?
- c++ - 为什么我在vscode中使用clangd时没有缩进?
- python - 将两个 SQL lite 数据库与 Python 结合起来
- reactjs - 选择选项时反应选择高度自动增加
- validation - 如何在 PhpStorm 中验证 ini 文件格式?
- laravel - laravel 在迁移中设置 postgresql 标识列