You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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);
}

修改说明

  1. 调整逻辑顺序:先初始化基础查询,依次应用搜索、分类过滤,最后处理分页,确保所有过滤条件都能生效。
  2. 合并查询逻辑:将搜索和分类过滤合并到同一个查询中,避免分支导致的逻辑遗漏。
  3. 精准分页计算:总页数根据过滤后的商品数量计算,保证分页准确性。
  4. 移除无效代码:删除原方法中永远无法执行的搜索逻辑块。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 06:16:19