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

ASP.NET Core MVC控制器中如何用搜索参数过滤食谱对象列表?

ASP.NET Core MVC食谱搜索功能优化建议

关于StringComparison.OrdinalIgnoreCase的最佳实践

完全没问题,这甚至是推荐的最佳实践:

  • 它不依赖区域/文化设置,避免了不同语言大小写转换规则导致的匹配错误(比如土耳其语中I和i的特殊转换)。
  • 性能比ToLower()/ToUpper()更高,不会产生额外的字符串实例,也规避了空引用风险。
  • 对于食谱名称这类不需要文化敏感匹配的场景,完全适用。

空值/空搜索字符串的高效处理

你当前的!string.IsNullOrWhiteSpace(search)写法已经是标准高效的,但可以做两点优化:

  1. 提前短路逻辑:如果搜索参数是空/空白,直接返回全量数据,避免先获取所有数据再判断的冗余操作(尤其当外部API调用开销较大时)。
  2. 清除输入空白:对非空的搜索参数做Trim()处理,避免用户输入前后空格导致的匹配失效。

另外,如果你的外部API支持服务器端搜索过滤,请优先让API处理搜索逻辑——这比客户端拿到全量数据后再过滤更高效,能大幅减少网络传输的数据量。

优化后的代码示例

客户端过滤版本(原逻辑优化)

public async Task<ActionResult> Index(string? search)
{
    // 空白搜索直接返回全量食谱
    if (string.IsNullOrWhiteSpace(search))
    {
        return View(await _recipeService.GetRecipesAsync());
    }

    // 非空搜索时过滤食谱
    var searchTerm = search.Trim();
    var recipes = (await _recipeService.GetRecipesAsync())
        .Where(r => r.strMeal.Contains(searchTerm, StringComparison.OrdinalIgnoreCase))
        .ToList();

    return View(recipes);
}

服务器端过滤版本(推荐,需API支持)

先在RecipeService中新增方法:

public async Task<List<Recipe>> GetRecipesByNameAsync(string searchTerm)
{
    // 调用外部API时带上搜索参数,比如:
    var response = await _httpClient.GetFromJsonAsync<List<Recipe>>(
        $"https://your-api-url/recipes?name={Uri.EscapeDataString(searchTerm)}");
    return response ?? new List<Recipe>();
}

然后控制器代码简化为:

public async Task<ActionResult> Index(string? search)
{
    var recipes = string.IsNullOrWhiteSpace(search)
        ? await _recipeService.GetRecipesAsync()
        : await _recipeService.GetRecipesByNameAsync(search.Trim());

    return View(recipes);
}

内容的提问来源于stack exchange,提问作者Megha Kamalan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 17:44:50