ASP.NET Core MVC控制器中如何用搜索参数过滤食谱对象列表?
ASP.NET Core MVC食谱搜索功能优化建议
关于StringComparison.OrdinalIgnoreCase的最佳实践
完全没问题,这甚至是推荐的最佳实践:
- 它不依赖区域/文化设置,避免了不同语言大小写转换规则导致的匹配错误(比如土耳其语中
I和i的特殊转换)。 - 性能比
ToLower()/ToUpper()更高,不会产生额外的字符串实例,也规避了空引用风险。 - 对于食谱名称这类不需要文化敏感匹配的场景,完全适用。
空值/空搜索字符串的高效处理
你当前的!string.IsNullOrWhiteSpace(search)写法已经是标准高效的,但可以做两点优化:
- 提前短路逻辑:如果搜索参数是空/空白,直接返回全量数据,避免先获取所有数据再判断的冗余操作(尤其当外部API调用开销较大时)。
- 清除输入空白:对非空的搜索参数做
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
相关产品推荐
相关产品推荐

