ASP.NET MVC控制器Post搜索后页面刷新数据不持久如何解决
问题解决:ASP.NET MVC 搜索提交后刷新页面结果丢失
根因说明
你当前的逻辑中搜索是POST提交到后端,提交后直接返回视图,此时浏览器地址栏未携带搜索关键词参数。页面刷新时浏览器会重新发起无参数的GET请求调用默认的Index方法,既不会携带之前的搜索关键词txtDealer,你也没有将搜索关键词持久化回传给视图,因此刷新后就会丢失搜索结果。
解决方案
如果没有特殊的提交安全要求,优先选择方案1,实现更简单也更符合通用规范
方案1:统一使用GET请求处理搜索(推荐)
该方案符合HTTP查询类请求的规范,天然支持页面刷新、结果页收藏、分享等操作,不需要额外做持久化处理。
- 第一步:修改前端表单提交方式为GET,同时给搜索框绑定当前搜索值,避免提交后搜索框内容清空:
@using (Html.BeginForm("Index", "Dealer",FormMethod.Get)) { <input type="text" value="@ViewBag.SearchKeyword" name="txtDealer" placeholder="Search Dealers by Name, City or State" /> <img src="/assets/images/search.png" class="search-icon"> }
- 第二步:合并GET和POST的
Index方法,统一处理搜索和分页逻辑:
public ActionResult Index(string txtDealer = null, int? page = 1) { int PageSize = 30; int skip = PageSize * (page.GetValueOrDefault() - 1); var Data = string.IsNullOrEmpty(txtDealer) ? GetDealersData(PageSize, skip) : GetDealersDataByName(PageSize, skip, txtDealer); Data.PageSize = PageSize; TempData["currentPageIndex"] = page.GetValueOrDefault(); TempData["PageSize"] = PageSize; TempData["Total"] = Data.Total; // 将搜索关键词传给视图,用于搜索框回填和分页参数携带 ViewBag.SearchKeyword = txtDealer; return View(Data.Data.ToPagedList(page.GetValueOrDefault(), PageSize, Data.Total)); }
- 补充:如果页面有分页跳转链接,需要将
txtDealer参数拼接到分页链接中,避免点分页时丢失搜索条件。
方案2:保留POST提交逻辑,使用PRG模式
如果业务要求必须用POST提交,可以采用Post/Redirect/Get模式,避免重复提交的同时解决刷新丢数据的问题:
- 第一步:修改POST类型的
Index方法,处理完参数后重定向到GET的Index方法,将搜索参数放在URL中:
[HttpPost] public ActionResult Index(string txtDealer, int? page = 1) { return RedirectToAction("Index", new { txtDealer = txtDealer, page = page }); }
- 第二步:GET类型的
Index方法沿用方案1中合并后的逻辑即可。
内容的提问来源于stack exchange,提问作者DParmar
相关产品推荐
相关产品推荐

