ASP.NET MVC中用下拉列表更新每页显示元素数的实现方法
解决方法:获取下拉框选中值并动态设置PageSize
我来帮你搞定这个问题,核心是要把下拉框的选中值传递到控制器,映射成对应的每页条数,同时还要处理分页时的参数保留和选中状态回显,一步步来:
1. 在控制器Action中接收下拉框参数
你的下拉框name是NbElementsPerPageChosen,可以直接在Action的参数列表里添加这个参数,或者通过Request.Form/Request.QueryString获取。比如你的Index Action可以改成这样:
public ActionResult Index(int? page, string NbElementsPerPageChosen) { // 初始化默认每页条数 int pageSize = 10; // 根据下拉框选中的Value映射对应条数 switch(NbElementsPerPageChosen) { case "1": pageSize = 25; break; case "2": pageSize = 50; break; case "3": pageSize = 100; break; case "4": // "All"选项直接设为总数据条数 pageSize = db.Students.Count(); break; default: // 默认回到10条,也可以保留之前的默认值 pageSize = 10; break; } // 正常获取数据并分页 var students = db.Students.OrderBy(s => s.LastName); int pageNumber = (page ?? 1); var pagedStudents = students.ToPagedList(pageNumber, pageSize); // 回显下拉框的选中状态:重新生成SelectList时标记选中项 List<SelectListItem> items = new List<SelectListItem>(); items.Add(new SelectListItem { Text = "10", Value = "0", Selected = string.IsNullOrEmpty(NbElementsPerPageChosen) || NbElementsPerPageChosen == "0" }); items.Add(new SelectListItem { Text = "25", Value = "1", Selected = NbElementsPerPageChosen == "1" }); items.Add(new SelectListItem { Text = "50", Value = "2", Selected = NbElementsPerPageChosen == "2" }); items.Add(new SelectListItem { Text = "100", Value = "3", Selected = NbElementsPerPageChosen == "3" }); items.Add(new SelectListItem { Text = "All", Value = "4", Selected = NbElementsPerPageChosen == "4" }); ViewBag.listNbElementsPerPage = items; return View(pagedStudents); }
2. 让下拉框选择后自动触发更新
你需要给下拉框添加onchange事件,选中后自动提交请求,把选中值传给控制器:
如果是用GET请求(默认Index是GET),可以用JS跳转:
@Html.DropDownList("NbElementsPerPageChosen", (SelectList)ViewBag.listNbElementsPerPage, new { onchange = "window.location.href = '/Students/Index?NbElementsPerPageChosen=' + this.value;" })
如果是POST请求,把下拉框放在<form>标签里,用提交表单的方式:
@using (Html.BeginForm()) { @Html.DropDownList("NbElementsPerPageChosen", (SelectList)ViewBag.listNbElementsPerPage, new { onchange = "this.form.submit();" }) }
3. 分页时保留每页条数参数
PagedList默认的分页链接只会带page参数,所以要修改分页控件的生成代码,把NbElementsPerPageChosen参数带上,避免翻页时丢失当前选中的每页条数:
@Html.PagedListPager(Model, page => Url.Action("Index", new { page, NbElementsPerPageChosen = Request.QueryString["NbElementsPerPageChosen"] }))
额外小提示
- 建议把下拉框的选项(比如10、25、50这些数值)抽成常量或者配置文件,不要硬编码在控制器里,后续修改更方便。
- 处理"All"选项时,直接设为总数据条数,PagedList会自动渲染成单页,分页控件也会自动隐藏。
- 如果是GET请求,参数会显示在URL里,方便用户保存书签或者分享链接;POST请求则更适合敏感数据场景,这里分页用GET就足够了。
内容的提问来源于stack exchange,提问作者Damian Taylor
相关产品推荐
相关产品推荐

