如何在Controller中实现两种商品搜索方式?
商品名称搜索失效问题修复方案
已实现按分类(Category)搜索商品的功能,但按名称搜索时始终返回全部商品。点击全部分类、水果、手机等分类标签可正常显示对应商品,仅名称搜索功能异常。
原Controller代码
public async Task<IActionResult> Index(string categorySlug = "", int p = 1, string searchString=null) { //ViewBag yerine Model'da ProductIndex'de bunları tanımla int pageSize = 3; ViewBag.PageNumber = p; ViewBag.PageRange = pageSize; ViewBag.CategorySlug = categorySlug; if (categorySlug == "") { ViewBag.TotalPages = (int)Math.Ceiling((decimal)_context.Products.Count() / pageSize); return View(await _context.Products.OrderByDescending(p => p.Id).Skip((p - 1) * pageSize).Take(pageSize).ToListAsync()); } Category category = await _context.Categories.Where(c => c.Slug == categorySlug).FirstOrDefaultAsync(); if (category == null) return RedirectToAction("Index"); var productsByCategory = _context.Products.Where(p => p.CategoryId == category.Id); ViewBag.TotalPages = (int)Math.Ceiling((decimal)productsByCategory.Count() / pageSize); return View(await productsByCategory.OrderByDescending(p => p.Id).Skip((p - 1) * pageSize).Take(pageSize).ToListAsync()); var products = from m in _context.Products select m; if (!String.IsNullOrEmpty(searchString)) { products = products.Where(s => s.Name!.Contains(searchString)); } return View(await products.ToListAsync()); }
问题根源
Index方法中,搜索逻辑代码位于两个return语句之后,永远不会被执行。当提交名称搜索时,categorySlug为空,会直接进入第一个if分支,返回未经过滤的全部分页商品,完全跳过了搜索过滤逻辑。
修复后的Controller代码
public async Task<IActionResult> Index(string categorySlug = "", int p = 1, string searchString = null) { int pageSize = 3; ViewBag.PageNumber = p; ViewBag.PageRange = pageSize; ViewBag.CategorySlug = categorySlug; // 初始化基础商品查询 var productsQuery = _context.Products.AsQueryable(); // 应用名称搜索过滤 if (!string.IsNullOrEmpty(searchString)) { productsQuery = productsQuery.Where(s => s.Name!.Contains(searchString)); } // 应用分类过滤 if (!string.IsNullOrEmpty(categorySlug)) { Category category = await _context.Categories.Where(c => c.Slug == categorySlug).FirstOrDefaultAsync(); if (category == null) return RedirectToAction("Index"); productsQuery = productsQuery.Where(p => p.CategoryId == category.Id); } // 基于过滤后的数据集计算总页数 var totalItems = await productsQuery.CountAsync(); ViewBag.TotalPages = (int)Math.Ceiling((decimal)totalItems / pageSize); // 分页并返回结果 var products = await productsQuery .OrderByDescending(p => p.Id) .Skip((p - 1) * pageSize) .Take(pageSize) .ToListAsync(); return View(products); }
修改说明
- 调整逻辑顺序:先初始化基础查询,依次应用搜索、分类过滤,最后处理分页,确保所有过滤条件都能生效。
- 合并查询逻辑:将搜索和分类过滤合并到同一个查询中,避免分支导致的逻辑遗漏。
- 精准分页计算:总页数根据过滤后的商品数量计算,保证分页准确性。
- 移除无效代码:删除原方法中永远无法执行的搜索逻辑块。
View代码无需修改
你的搜索表单代码是正确的,提交的SearchString参数能正确传递到Controller方法:
<form asp-controller="Products" asp-action="Index" method="get"> <p> Search: <input type="text" name="SearchString" /> <input type="submit" value="Filter" /> </p> </form>
内容的提问来源于stack exchange,提问作者XcellentEEE
相关产品推荐
相关产品推荐

