ASP.NET MVC重定向至All Action时无法传递query参数问题
问题原因分析
你遇到的核心问题是:RedirectToAction会发起新的GET请求,无法直接传递List<FlightViewModel>这类复杂对象。GET请求只能通过URL参数传递简单类型(如字符串、数字、日期等),ASP.NET MVC无法自动将复杂集合序列化为URL参数,所以All Action中的query参数始终为空。
解决方案
下面提供三种可行方案,按推荐程度排序:
方案一:传递查询条件而非结果(推荐)
更合理的做法是把搜索条件传递给All Action,让它重新调用服务获取数据。这种方式符合RESTful设计,且URL可分享、无状态。
修改All Action
[HttpGet] [AllowAnonymous] public async Task<IActionResult> All(string sorting, DateTime? searchDate, int? arrivalAirportId, int? departureAirportId, int page=1) { var result = await flightService.AllFlightsFilter( sorting, searchDate, arrivalAirportId, departureAirportId ); var pagedFlights = result.ToPagedList(page, pageSize); return View(pagedFlights); }
修改Search Action
[HttpPost] public async Task<IActionResult> Search(AllFlightsQueryModel query) { return RedirectToAction("All", new { sorting = query.Sorting, searchDate = query.SearchDate, arrivalAirportId = query.ArrivalAirportId, departureAirportId = query.DepartureAirportId, page = 1 }); }
方案二:使用TempData传递复杂对象
TempData可以在两次请求之间临时存储数据,适合重定向场景(数据仅存活一次请求)。
修改Search Action
[HttpPost] public async Task<IActionResult> Search(AllFlightsQueryModel query) { var result = await flightService.AllFlightsFilter( query.Sorting, query.SearchDate, query.ArrivalAirportId, query.DepartureAirportId ); // 序列化复杂对象存入TempData(需安装Newtonsoft.Json包) TempData["FilteredFlights"] = JsonConvert.SerializeObject(result); return RedirectToAction("All", new { page=1}); }
修改All Action
[HttpGet] [AllowAnonymous] public async Task<IActionResult> All(int page=1) { if (TempData["FilteredFlights"] is string json) { var query = JsonConvert.DeserializeObject<List<FlightViewModel>>(json); var pagedFlights = query.ToPagedList(page, pageSize); return View(pagedFlights); } // 无数据时返回空分页列表 return View(new PagedList<FlightViewModel>(new List<FlightViewModel>(), page, pageSize)); }
方案三:直接返回All视图(不重定向)
如果不需要URL跳转到All路径,可直接在Search Action处理分页后返回All视图。
修改Search Action
[HttpPost] public async Task<IActionResult> Search(AllFlightsQueryModel query) { var result = await flightService.AllFlightsFilter( query.Sorting, query.SearchDate, query.ArrivalAirportId, query.DepartureAirportId ); var pagedFlights = result.ToPagedList(query.page ?? 1, pageSize); // 直接返回All视图并传递分页数据 return View("All", pagedFlights); }
内容的提问来源于stack exchange,提问作者Georgi Bisolnev
相关产品推荐
相关产品推荐

