首页 > 解决方案 > 如何在 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

        }
    }
}

标签: c#asp.net-mvcrazorasp.net-core-2.0

解决方案


因为selectedItems,我认为你需要从而ViewBag.Lista不是检索productVM.ProductsFormViewto发帖时ControllerProductViewModel.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);
    }

推荐阅读