ASP.NET Core MVC中基于城市搜索酒店的功能失效问题排查
酒店按城市搜索功能故障排查与修复
以下是针对你的酒店搜索功能问题的排查和修复方案:
问题场景
基于SQL Server的酒店项目中,按城市搜索酒店的功能无法正常工作,你提供了控制器和视图代码。
原代码问题分析
- 空参数处理缺失:当
city参数为空时,a.City.Contains(city)等价于Contains(null),会导致查询返回空结果,而非显示所有酒店。 - 大小写敏感问题:SQL Server默认字符串比较区分大小写,若数据库中城市名是"Beijing",搜索"beijing"会匹配失败。
- HTML结构不完整:视图中只有
<tr>标签,缺少<table>、<thead>、<tbody>等必要结构,可能导致搜索结果无法正常渲染。 - 数据传递冗余:同时使用
Model和ViewBag传递数据,容易造成逻辑混淆。
修复后的代码
控制器代码
public IActionResult Index(string city) { // 处理空参数,返回所有酒店;否则执行不区分大小写的模糊搜索 var hotels = string.IsNullOrEmpty(city) ? _context.hotel.ToList() : _context.hotel.Where(a => a.City.IndexOf(city, StringComparison.OrdinalIgnoreCase) >= 0).ToList(); // 直接将数据传给View,避免冗余的ViewBag return View(hotels); }
视图代码
<form asp-controller="Home" asp-action="index" method="get"> <div class="row p-2"> <div class="col-3"> <!-- 回显搜索关键词,提升用户体验 --> <input name="city" type="text" class="form-control" value="@Context.Request.Query["city"]" /> </div> <div class="col-3"> <button type="submit" class="btn btn-success">search</button> </div> </div> </form> <div class="row"> <div class="col"> <!-- 完善表格结构,确保结果正常渲染 --> <table class="table table-bordered"> <thead> <tr> <th>ID</th> <th>酒店名称</th> <th>地址</th> <th>城市</th> <th>电话</th> <th>邮箱</th> <th>删除</th> <th>编辑</th> </tr> </thead> <tbody> <!-- 直接使用Model传递的数据,无需转换ViewBag --> @foreach (var item in Model as List<Hotel>) { <tr class="text-center"> <td>@item.Id</td> <td>@item.Name</td> <td>@item.Address</td> <td>@item.City</td> <td>@item.Phone</td> <td>@item.Email</td> <td><a asp-action="Delete" asp-route-id="@item.Id"><i class="fa fa-trash text-danger"></i></a></td> <td><a asp-action="Edit" asp-route-id="@item.Id"><i class="fa fa-edit text-success"></i></a></td> </tr> } </tbody> </table> </div> </div>
额外建议
- 可以给输入的城市关键词添加
Trim()处理,避免空格导致的匹配失败:city = city?.Trim() - 若需要更高效的模糊搜索,可在SQL Server的
City字段上创建全文索引,使用EF.Functions.FreeText等方法优化查询性能。
内容的提问来源于stack exchange,提问作者Samia
相关产品推荐
相关产品推荐

