【发布时间】:2008-11-24 09:57:13
【问题描述】:
我想从一个控制器中的动作重定向到第二个控制器中的动作。通常我会使用 RedirectToAction("actionName", "controllerName", objects); 我要重定向到的方法有两个重载:
- 一个用于 HttpVerbs.Get,用于直接链接
- 一个用于 HttpVerbs.Post 接受通过模型绑定填充的引用类型
当我使用 RedirectToAction 方法进行重定向时,默认情况下我会重定向到 GET 方法,这当然与我的参数不匹配。
如何确保它重定向到正确操作的重载?
--编辑--
根据要求提供一些更具体的细节:
我要重定向到的动作根据参数填充viewData,然后调用正确的视图。
public ActionResult OverView(SearchBag searchBag, IngredientBag ingredientBag) {
它有第二个版本的 Gets,所以它也可以通过 GET 工作:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult OverView(int colorId, string paintCode, string name, int formulaId) {
return OverView(new SearchBag()
{ ColorId = colorId, PaintCode = paintCode, ColorName = name, FormulaId = formulaId }
, formulaViewData.IngredientBag);
}
我现在调用的是另一个控制器。它会进行一些预先计算,获取所需的信息,然后执行与之前的操作完全相同的操作。我可以从第一个操作中复制代码,但我宁愿只调用该操作。
[AcceptVerbs(HttpVerbs.Post)]
public RedirectToRouteResult ReCalculate(SearchBag searchBag, IngredientBag ingredientBag) {
我可以创建下一个控制器的临时本地实例,但我注意到它没有正确的 HTTPContext 并且没有命中初始化方法。
【问题讨论】:
-
你可以像这样 [AcceptVerbs(HttpVerbs.Post | HttpVerbs.Get)] 将多个动词放在一个动作上
-
那么您是否尝试将 RedirectToAction 从 ReCalculate 操作重定向到 OverView 操作?
-
是的。由于我获取了所有对象并在 ReCalculate 中重新计算了它们,因此我不想在概览操作中再次这样做
-
重点是redirect总是使用get。我不想使用get。我已经获取并重新计算了我的对象。我只是想把它们传下去..
-
你必须使用get,但你可以使用TempData来避免重新计算。正如我在回答中所建议的那样。
标签: asp.net-mvc cross-controller-redirect