如何通过复选框分类筛选枪械产品数据?
如何根据选中的复选框分类筛选枪械产品?
需求:选中如“Pistols”这类复选框时,仅显示对应类别的枪械。以下是基于现有代码的修改方案:
1. 前端视图修改
先调整复选框的属性,让所有类别复选框使用统一的名称,方便后端接收选中的类别列表;同时将筛选控件包裹在表单中,和价格筛选一起提交。
修改后的视图代码:
<form asp-action="weapons" method="get"> <!-- 价格筛选控件 --> <div> <label for="MinPrice">最低价格:</label> <input type="number" id="MinPrice" name="MinPrice" value="@ViewData["MinimumPrice"]" /> <label for="MaxPrice">最高价格:</label> <input type="number" id="MaxPrice" name="MaxPrice" value="@ViewData["MaximumPrice"]" /> </div> <!-- 类别复选框区域 --> <div style="background-color: #454545;"> <ul class="category-ul"> <li> <input type="checkbox" id="pistol" name="selectedCategories" value="Pistols" @(ViewData["selectedCategories"] is List<string> cats && cats.Contains("Pistols") ? "checked" : "")> <label for="pistol">Pistols</label> </li> <li> <input type="checkbox" id="smg" name="selectedCategories" value="SMGs" @(ViewData["selectedCategories"] is List<string> cats && cats.Contains("SMGs") ? "checked" : "")> <label for="smg">SMGs</label> </li> <li> <input type="checkbox" id="rev" name="selectedCategories" value="Revolvers" @(ViewData["selectedCategories"] is List<string> cats && cats.Contains("Revolvers") ? "checked" : "")> <label for="rev">Revolvers</label> </li> <li> <input type="checkbox" id="shotgun" name="selectedCategories" value="Shotguns" @(ViewData["selectedCategories"] is List<string> cats && cats.Contains("Shotguns") ? "checked" : "")> <label for="shotgun">Shotguns</label> </li> <li> <input type="checkbox" id="assault" name="selectedCategories" value="AssaultRifles" @(ViewData["selectedCategories"] is List<string> cats && cats.Contains("AssaultRifles") ? "checked" : "")> <label for="assault">Assault Rifles</label> </li> <li> <input type="checkbox" id="rifle" name="selectedCategories" value="Rifles" @(ViewData["selectedCategories"] is List<string> cats && cats.Contains("Rifles") ? "checked" : "")> <label for="rifle">Rifles</label> </li> </ul> </div> <button type="submit">筛选</button> </form>
核心调整:
- 所有复选框统一使用
name="selectedCategories",value设置为和Firearm模型中Category字段一致的内容; - 添加复选框状态回显逻辑,提交后保持选中状态;
- 将所有筛选控件放入表单,通过GET请求提交参数。
2. 控制器修改
添加接收选中类别的参数,同时新增类别筛选逻辑:
修改后的控制器代码:
public async Task<IActionResult> weapons(decimal MinPrice, decimal MaxPrice, List<string> selectedCategories) { var firearms = from s in _context.Firearm select s; var max = firearms.Max(i => i.Price); // 处理MaxPrice默认值:仅当未传入有效值时设为最大值 if (MaxPrice == 0) { MaxPrice = max; } ViewData["MinimumPrice"] = MinPrice; ViewData["MaximumPrice"] = MaxPrice; ViewData["Maximum"] = max; // 保存选中的类别用于视图回显 ViewData["selectedCategories"] = selectedCategories; // 价格筛选 if (MinPrice > 0 || MaxPrice < max) { firearms = firearms.Where(s => s.Price >= MinPrice && s.Price <= MaxPrice); } // 类别筛选:有选中项时才过滤 if (selectedCategories != null && selectedCategories.Any()) { firearms = firearms.Where(s => selectedCategories.Contains(s.Category)); } return View(await firearms.AsNoTracking().ToListAsync()); }
核心调整:
- 新增
List<string> selectedCategories参数接收前端提交的选中类别; - 添加类别筛选逻辑:当有选中的类别时,仅保留对应分类的枪械;
- 修复原代码中
MaxPrice强制赋值的问题,优化价格筛选的边界判断; - 存入选中类别到
ViewData,用于视图的复选框状态回显。
3. 模型说明
现有Firearm模型中的Category字段完全符合需求,只需确保数据库中该字段的值和复选框的value完全匹配(如“Pistols”“SMGs”等)即可,无需额外修改。
内容的提问来源于stack exchange,提问作者tyg9o
相关产品推荐
相关产品推荐

