ASP.NET MVC控制器Index方法代码功能解析求助
ASP.NET MVC 控制器Index方法逻辑说明
这是人员列表页对应的控制器Action方法,核心作用是查询人员数据、按请求参数排序、分页后传递给视图渲染,接收两个可选请求参数:可空整型页码page、字符串类型排序规则sort。
数据库上下文初始化
方法内首先用using块声明Entity Framework的数据库上下文实例istecEntities,using语法会保证代码块执行结束后自动释放数据库连接等资源,避免资源泄漏,所有数据操作都在这个块内完成:
using(istecEntities ctx = new istecEntities()) { // 数据操作逻辑 }
基础人员数据查询
这一步先从数据库Persons表读取全量人员数据,再在内存中完成模型映射,构造业务层使用的Person对象列表:
var Persons = ctx.Persons.ToList() .Select(p => new Person { Num = p.num, Name = p.Name, Area = p.Area, Grades = p.Grades as List<Grade> }).ToList<Person>();
- 第一个
ToList()会触发数据库查询,把Persons表的所有数据加载到内存 - 后续
Select是内存操作,把EF生成的数据库实体对象转换成自定义的Person业务模型,同时把关联的成绩集合Grades转换为List<Grade>类型 - 这种写法在数据量大时会有性能问题,但学校项目数据量小,不会有实际影响
排序逻辑分支
通过switch语句根据传入的sort参数对内存中的人员列表做排序:
sort值为numdesc:按人员编号Num降序排列sort值为NameDesc:按人员姓名Name降序排列sort值为NameAsc:按人员姓名Name升序排列- 其余所有情况(包括
sort为空的首次访问场景):默认按人员编号Num升序排列
switch (sort) { case "numdesc": Persons = Persons.OrderByDescending(p =>p.Num).ToList<Person>(); break; case "NameDesc": Persons = Persons.OrderByDescending(p =>p.Name).ToList<Person>(); break; case "NameAsc": Persons = Persons.OrderBy(p =>p.Name).ToList<Person>(); break; default: Persons = Persons.OrderBy(p =>p.Num).ToList<Person>(); break; }
视图辅助参数赋值
这部分给动态视图对象ViewBag传三个参数,供视图渲染排序按钮/链接使用,实现排序状态切换、UI高亮等效果:
ViewBag.sortnum:如果当前没有传入排序参数(默认排序状态),编号排序链接的目标参数设为numdesc(点击后按编号降序排列),否则设为空(点击后回到默认编号升序)ViewBag.sortName:如果当前姓名是降序排列,下次点击姓名排序就切换为升序NameAsc,否则切换为降序NameDesc,实现姓名排序的正反切换ViewBag.sort:把当前生效的排序规则传给视图,用来标记当前选中的排序项
ViewBag.sortnum = (String.IsNullOrEmpty(sort)) ? "numdesc": ""; ViewBag.sortName = (sort == "NameDesc") ? "NameAsc": "NameDesc"; ViewBag.sort = sort;
分页处理与视图返回
最后处理分页逻辑,将处理好的分页数据传给视图渲染:
- 固定单页展示3条数据(
size = 3) - 用空合并运算符
??处理可空页码参数:如果没传page参数,默认展示第1页 - 调用分页组件的
ToPagedList扩展方法,把排序后的全量列表切割成对应页的分页数据,作为模型传给Index视图
int size = 3; int pagenumber = (page ?? 1); return View(Persons.ToPagedList<Person>(pagenumber, size));
注:生产环境下一般会把排序、分页逻辑下放到数据库层面执行,避免全表加载数据的性能损耗,演示项目无需严格遵循这个优化点。
内容的提问来源于stack exchange,提问作者ac88
相关产品推荐
相关产品推荐

