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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 10:10:19