搜索

查看: 3069|回复: 11

[ASP.NET] ASP.NET MVC实现下拉框多选

[复制链接]
发表于 2023-5-4 11:30:16 | 显示全部楼层 |阅读模式
Editor 2023-5-4 11:30:16 3069 11 看全部
我们知道,在ASP.NET MVC中实现多选Select的话,使用Html.ListBoxFor或Html.ListBox方法就可以。在实际应用中,到底该如何设计View Model, 控制器如何接收多选Select的选中项呢?
实现效果如下:

202292183241656.png

202292183241656.png


初始状态某些选项被选中。
当按着ctrl键,进行重新选择多项,点击"提交"按钮,把选中项的id拼接。

202292183241657.png

202292183241657.png


对于Select中的项,包含显示值,Value值,以及是否选中,抽象成如下的类。
    public class City
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public bool IsSelected { get; set; }
    }
对于整个多选Select来说,在ASP.NET MVC中,所有的选项被看作SelectListItem类型,选中的项是一个string类型的集合。于是多选Select的View Model设计为:
    public class CityVm
    {
        public IEnumerable  Cities { get; set; }
        public IEnumerable SelectedCities { get; set; }
    }
在HomeController中,把SelectListItem的集合赋值给CityVm的Cities属性。
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            var cities = new List
            {
                new City(){Id = 1, Name = "青岛", IsSelected = true},
                new City(){Id = 2, Name = "胶南", IsSelected = false},
                new City(){Id = 3, Name = "即墨", IsSelected = true},
                new City(){Id = 4, Name = "黄岛", IsSelected = false},
                new City(){Id = 5, Name = "济南", IsSelected = false}
            };
            var citiesToPass = from c in cities
                select new SelectListItem() {Text = c.Name, Value = c.Id.ToString(),Selected = c.IsSelected};
            
            CityVm cityVm = new CityVm();
            cityVm.Cities = citiesToPass;
            ViewData["cc"] = citiesToPass.Count();
            return View(cityVm);
        }
        ......
    }
在Home/Index.cshtml中,是一个CityVm的强类型视图,对于选中的项会以IEnumerable集合传递给控制器。
@model MvcApplication1.Models.CityVm
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
Index
@using (Html.BeginForm("GetCities", "Home", FormMethod.Post, new {id = "myForm"}))
{   
    @Html.ListBoxFor(c => c.SelectedCities, Model.Cities, new {size = ViewData["cc"]})
   
   
}
在HomeController中,再把从视图传递过来的IEnumerable拼接并呈现。
    public class HomeController : Controller
    {
        ......
        [HttpPost]
        public ActionResult GetCities(IEnumerable selectedCities)
        {
            if (selectedCities == null)
            {
                return Content("没有选中任何选项");
            }
            else
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("选中项的Id是:" + string.Join(",", selectedCities));
                return Content(sb.ToString());
            }
        }
    }
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对知鸟论坛的支持。如果你想了解更多相关内容请查看下面相关链接
回复

使用道具 举报

发表于 2023-6-29 03:44:34 | 显示全部楼层
风来时狂放 2023-6-29 03:44:34 看全部
这东西我收了!谢谢楼主!知鸟论坛真好!
回复

使用道具 举报

发表于 2023-6-29 19:06:01 | 显示全部楼层
冀苍鸾 2023-6-29 19:06:01 看全部
其实我一直觉得楼主的品味不错!呵呵!知鸟论坛太棒了!
回复

使用道具 举报

发表于 2023-6-29 19:46:59 | 显示全部楼层
掌舵的鱼1987 2023-6-29 19:46:59 看全部
既然你诚信诚意的推荐了,那我就勉为其难的看看吧!知鸟论坛不走平凡路。
回复

使用道具 举报

发表于 2023-6-29 20:38:06 | 显示全部楼层
无人岛屿颈 2023-6-29 20:38:06 看全部
楼主发贴辛苦了,谢谢楼主分享!我觉得知鸟论坛是注册对了!
回复

使用道具 举报

发表于 2023-6-29 22:58:25 | 显示全部楼层
123456833 2023-6-29 22:58:25 看全部
其实我一直觉得楼主的品味不错!呵呵!知鸟论坛太棒了!
回复

使用道具 举报

发表于 2023-6-30 00:41:48 | 显示全部楼层
老橡树1 2023-6-30 00:41:48 看全部
楼主发贴辛苦了,谢谢楼主分享!我觉得知鸟论坛是注册对了!
回复

使用道具 举报

发表于 2023-6-30 14:42:52 | 显示全部楼层
Gordon520 2023-6-30 14:42:52 看全部
论坛不能没有像楼主这样的人才啊!我会一直支持知鸟论坛
回复

使用道具 举报

发表于 2023-6-30 15:27:42 | 显示全部楼层
123456848 2023-6-30 15:27:42 看全部
感谢楼主的无私分享!要想知鸟论坛好 就靠你我他
回复

使用道具 举报

发表于 2023-6-30 16:09:10 | 显示全部楼层
尘埃416 2023-6-30 16:09:10 看全部
楼主太厉害了!楼主,I*老*虎*U!我觉得知鸟论坛真是个好地方!
回复

使用道具 举报

  • 您可能感兴趣
点击右侧快捷回复 【请勿灌水】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 返回列表

RSS订阅| SiteMap| 小黑屋| 知鸟论坛
联系邮箱E-mail:zniao@foxmail.com
快速回复 返回顶部 返回列表