ASP.NET MVC表单提交后如何重定向至Results页面而非详情页?
解决方案
核心问题在于RedirectToAction会触发浏览器发起GET请求,而你定义的Results方法仅接受POST请求,导致无法匹配;同时直接传递模型会被解析为URL参数,而非绑定到POST方法的参数。结合你不想重复执行20秒查询的需求,可按以下步骤调整:
1. 调整Results方法,新增GET版本复用查询结果
将原本仅支持POST的Results拆分为两个版本:POST版本用于首次从Query页提交查询,GET版本用于上传后的重定向复用已有结果。同时在首次查询时将结果存入Session,避免重复执行耗时操作:
// 处理Query页的POST提交,执行耗时查询并缓存结果 [HttpPost] [ValidateAntiForgeryToken] public ActionResult Results(InventoryModel model) { // 执行耗时20秒的数据库查询 var queryResult = // 你的查询逻辑代码 // 将模型和查询结果存入Session,供后续复用 Session["InventoryModel"] = model; Session["InventoryQueryResult"] = queryResult; return View(queryResult); } // 供上传后重定向使用的GET版本,直接从Session取缓存结果 [HttpGet] public ActionResult Results() { var queryResult = Session["InventoryQueryResult"] as YourQueryResultType; if (queryResult == null) { // 若缓存失效,重定向回Query页 return RedirectToAction("Query"); } return View(queryResult); }
2. 修改Upload方法,重定向到GET版Results
完成文件上传后,直接重定向到GET版本的Results,无需传递模型(Session中已缓存所需数据):
[HttpPost] [ValidateAntiForgeryToken()] public ActionResult Upload(HttpPostedFileBase file, string item) { // 执行文件保存逻辑(代码省略) // 直接重定向到GET版Results,复用缓存的查询结果 return RedirectToAction("Results"); }
补充说明
- 若你的查询结果体积较大,Session是合适的缓存方式;若模型较小,也可使用
TempData(但TempData仅在单次重定向后有效,需注意生命周期)。 - 可根据业务需求设置Session的超时时间,避免无效缓存占用资源;也可在用户离开Inventory相关页面时主动清理Session中的缓存数据。
内容的提问来源于stack exchange,提问作者user22019322
相关产品推荐
相关产品推荐

