ASP.NET Core搜索栏返回结果在视图中为空的问题求助
问题分析与解决方案
看起来你离解决问题只差最后一步啦!核心问题出在控制器和视图的数据传递逻辑上,咱们一步步拆解:
1. 控制器的问题:没有把查询结果传递给视图
你在HomeController里虽然调用DataAccess.GetSearchData拿到了lstModel结果列表,但最后返回的还是用户提交的原始model(这个model只有Query有值,Subject和Body本来就是空的)。另外,你把lstModel声明成了控制器的类级字段,这在ASP.NET MVC里非常危险——多用户同时请求时会互相干扰数据。
修改HomeController(快速修复版)
把查询结果通过ViewBag传递给视图,同时把列表变量放到方法内部:
public ActionResult Index(SearchViewModel model) { if (!ModelState.IsValid) { // 验证失败返回原视图 return View(model); } else { string searchString = model.Query; // 方法内部声明列表,避免多线程冲突 List<SearchViewModel> lstModel = new List<SearchViewModel>(); DataAccess.GetSearchData(searchString, out lstModel); // 把结果列表存入ViewBag供视图使用 ViewBag.SearchResults = lstModel; return View(model); } }
更规范的做法:创建结果ViewModel
如果想让代码更易维护,建议专门创建一个包含查询条件和结果的ViewModel:
public class SearchResultsViewModel { // 用户提交的查询条件 public SearchViewModel SearchCriteria { get; set; } // 查询到的结果列表 public List<SearchViewModel> Results { get; set; } }
然后修改控制器返回这个强类型模型:
public ActionResult Index(SearchViewModel model) { var resultsModel = new SearchResultsViewModel { SearchCriteria = model }; if (!ModelState.IsValid) { return View(resultsModel); } else { string searchString = model.Query; List<SearchViewModel> lstModel = new List<SearchViewModel>(); DataAccess.GetSearchData(searchString, out lstModel); resultsModel.Results = lstModel; return View(resultsModel); } }
2. 视图的问题:没有遍历结果列表,错误访问空属性
你当前的视图直接用@Model.Subject和@Model.Body,但这个Model是用户提交的查询条件(Subject和Body从未被赋值),而且查询结果是一个列表,必须遍历才能展示每条数据。
修改Index视图(对应ViewBag快速修复版)
@using (Html.BeginForm()) { @Html.LabelFor(x => Model.Query) @Html.EditorFor(x => Model.Query) @Html.ValidationMessageFor(x => Model.Query) <button type="submit">Search</button> } @{ // 把ViewBag里的结果转成强类型列表 var searchResults = ViewBag.SearchResults as List<SearchViewModel>; } @if (searchResults != null && searchResults.Any()) { <div class="results-panel" style="display:block;"> @foreach (var result in searchResults) { <div class="result-item"> <h4 class="card-title">@result.Subject</h4> <p>@result.Body</p> </div> } </div> } else if (!string.IsNullOrEmpty(Model.Query)) { <p>No results found.</p> }
对应强类型ViewModel的视图写法
先修改视图顶部的模型声明:
@model SearchResultsViewModel @using (Html.BeginForm()) { @Html.LabelFor(x => x.SearchCriteria.Query) @Html.EditorFor(x => x.SearchCriteria.Query) @Html.ValidationMessageFor(x => x.SearchCriteria.Query) <button type="submit">Search</button> } @if (Model.Results != null && Model.Results.Any()) { <div class="results-panel" style="display:block;"> @foreach (var result in Model.Results) { <div class="result-item"> <h4 class="card-title">@result.Subject</h4> <p>@result.Body</p> </div> } </div> } else if (!string.IsNullOrEmpty(Model.SearchCriteria.Query)) { <p>No results found.</p> }
额外小提示
- 你的
DataAccess里SQL是精确匹配Subject = @subject,如果需要模糊查询,可以改成Subject LIKE '%' + @subject + '%'(你用了参数化查询,不用担心SQL注入问题)。 DataAccess的catch块里建议添加日志记录,而不是只调用exc.ToString(),否则出问题时很难排查。
内容的提问来源于stack exchange,提问作者Andrew Reese
相关产品推荐
相关产品推荐

