如何在ASP.NET MVC中添加搜索栏并将搜索结果展示在另一页面
ASP.NET MVC 搜索功能调整方案
1. 视图代码调整
你当前的代码存在两层form嵌套的问题,这是导致提交异常的核心原因,直接按以下方式修改:
- 删除外层冗余的静态
<form>标签,把样式类和id放到Html.BeginForm的属性参数中 - 可选:如果需要支持用户刷新搜索结果页面、分享搜索链接,可将提交方式改为
FormMethod.Get
调整后视图代码参考:
@using (Html.BeginForm("RechercheResto", "Client", FormMethod.Post, new { @class = "row contact-form rounded-pill link no-gutters", @id = "contact-form-data" })) { @Html.AntiForgeryToken() <div class="col-12 col-lg-8 d-inline-block d-lg-flex align-items-center"> <div class="form-group"> <label><i class="lni lni-restaurant" aria-hidden="true"></i></label> <input type="text" name="nomResto" placeholder="Nom du restaurant" class="form-control" required> </div> </div> <div class="col-12 col-lg-4"> <i class="fa fa-spinner fa-spin mr-2 d-none" aria-hidden="true"></i> <input type="submit" class="btn main-btn rounded-pill w-100 h-100 contact_btn" value="Rechercher le restaurant" /> </div> }
2. 控制器代码调整
- 首先确认你已经创建了
RechercheResto.cshtml视图文件,且视图绑定的模型是IEnumerable<你的项目对应Restaurant实体的命名空间.Restaurant>,否则提交后会报视图找不到或模型绑定错误 - 可优化搜索逻辑,支持不区分大小写匹配,同时加空值兜底避免数据库查询异常
调整后控制器代码参考:
[ValidateAntiForgeryToken] // 如果修改为Get提交,删掉上面的[ValidateAntiForgeryToken]注解即可 public ActionResult RechercheResto(string nomResto) { // 空值兜底,避免数据库表为空时抛出空引用异常 var restoList = db.Restaurants?.ToList() ?? new List<Restaurant>(); if (!string.IsNullOrEmpty(nomResto)) { // 不区分大小写搜索,适配用户不同输入习惯 restoList = restoList.Where(r => r.name.Contains(nomResto, StringComparison.OrdinalIgnoreCase)).ToList(); } return View(restoList); }
3. 可选体验优化
- 在
RechercheResto视图中添加空结果提示,当搜索结果数量为0时,告知用户没有匹配的餐厅 - 可保留原搜索关键词回填到搜索框中,方便用户修改搜索条件
内容的提问来源于stack exchange,提问作者user15597443
相关产品推荐
相关产品推荐

