ASP.NET MVC如何根据选中样本展示对应样本详情数据
选中样本对应详情功能实现方案
问题根因
现在点击任意详情都显示全量数据,核心是两个逻辑漏了:
- 列表页跳详情的时候,没把当前点击行对应的样本ID传给后端
- 后端查结果的时候,只按当前登录用户做了过滤,没按选中的样本做筛选,自然返回用户名下所有样本的结果
分步修改代码
1. 修改列表视图的详情跳转参数
找到列表视图里foreach循环的操作列,把原来的Details跳转链接替换成下面的代码,额外传递当前行的样本ID:
@Html.ActionLink("Edit", "Edit", new { id=item.id }) | @Html.ActionLink("Details", "Details", new { id = item.id, sampleId = item.sample.id }) | @Html.ActionLink("Delete", "Delete", new { id=item.id })
这里的item.sample.id就是你列表里展示的样本ID,每一行渲染的时候会自动把当前行的样本ID拼到详情链接的参数里
2. 修改Details控制器的查询逻辑
原来的Details方法只接收id参数,查询时没加样本过滤,把方法改成下面的代码:
public ActionResult Details(int id, int sampleId) { int UserId = Convert.ToInt32(Session["UserID"]); // 先做权限校验:判断当前点击的项目是否属于当前登录用户,防止越权访问 var currentProgram = _context.hospital_programs .FirstOrDefault(x => x.id == id && x.hospital_id == UserId); if (currentProgram == null) { return HttpNotFound(); } // 查询结果时同时加两个过滤条件:属于当前用户 + 匹配当前选中的样本ID // 注意:下面代码里的r.sample_id要替换成你自己RESULTS表中存储样本ID的实际字段名 var results = _context.RESULTS .Where(r => r.custid == UserId && r.sample_id == sampleId) .ToList(); // 把当前样本的基础信息存在ViewBag里,方便详情页展示 ViewBag.CurrentProgram = currentProgram; return View(results); }
注意:如果你的RESULTS表关联样本的字段名不是
sample_id,一定要换成你实际的字段名,否则会报编译错误或者查不出数据。
3. (可选)适配Details视图
如果详情页需要展示当前样本的名称等基础信息,可以直接在Details视图里读取ViewBag里存的当前项目数据,比如在页面顶部加:
<h2>样本详情:@ViewBag.CurrentProgram.sample.name</h2>
之后遍历Model(也就是筛选后的results集合)展示结果即可,页面只会返回你选中的那个样本的对应数据。
参数传递链路
整个逻辑的传参流程是:
- 列表页渲染时,每一行的详情按钮自动携带当前行的样本ID
- 点击详情后,浏览器把项目ID、样本ID两个参数一起发给后端Details方法
- 后端先做权限校验,再根据传入的样本ID过滤查询结果,只返回匹配的数据
- 前端视图只渲染后端返回的匹配结果,实现点击不同样本展示对应详情的效果
内容的提问来源于stack exchange,提问作者MarwanAbu
相关产品推荐
相关产品推荐

