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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:17:52