重定向到另一个未在路由中注册的控制器/动作

本文关键字:注册 控制器 动作 路由 另一个 重定向 | 更新日期: 2023-09-27 18:07:15

我有如下的控制器,其中未在路由表中注册

public class InternalController : Controller
{
 /*this controller is not registered in routes table*/ 
      public ActionResult Foo()
      {
         return Content("Text from foo");
      }
}

从另一个控制器注册在路由表我想调用/重定向动作的前一个控制器,一个没有注册在路由表

public class AjaxController : Controller
{
 /*this controller is registered in routes table*/  
      public ActionResult Foo()
      {
           /*FROM HERE HOW DO I RETURN CONTENTS OF  
            controller=InternalController, action = Foo
           */
            /*
              i tried below piece of code but that doesnt seem to work
            */
            return RedirectToAction("Foo", "InternalController ");
      } 
}

已定义路由(仅添加一项)

    public void RegisterRoutes(RouteCollection routes)
    {
       routes.MapRoute("Ajax","ajax/{action}",new {
       controller="Ajax",
       action="Index"
       });
   }

重定向到另一个未在路由中注册的控制器/动作

如果你选择不注册路由…那么你可能有一个文件/控制器在一个特定的位置,不会改变。

在这种情况下,只需使用"Redirect"方法,而不是"RedirectToAction"。

例如:

return Redirect("~/Internal/Foo");

现在您已经展示了您的路由定义,很明显,您永远不能调用AjaxController以外的任何其他控制器。您只需在您的路线中禁止它们,因此InternalController永远无法服务。你必须修改你的路由定义。

根据你想要实现的目标和你想要的url看起来像你有几个可能性:

  • 保留默认路由
  • 像这样修改你现有的路由定义:

    routes.MapRoute(
        "Ajax",
        "{controller}/{action}",
        new { controller = "Ajax", action = "Index" }
    );
    

你可以创建RedirectController来重定向更多的Url和页面:

public class RedirectController : Controller
{
    public ActionResult Index()
    {
        var rd = this.RouteData.Values;
        string controller = rd["controller2"] as string;
        string action = rd["action2"] as string;
        rd.Remove("controller2");
        rd.Remove("action2");
        rd.Remove("controller");
        rd.Remove("action");
        return RedirectToActionPermanent(action, controller, rd);
    }
}

然后你可以在路由表中定义旧url的重定向:

routes.MapRoute(
 null, // Name
 "ajax/foo",
 new { controller = "Redirect",
       action = "Index",
       controller2 = "InternalController",
       action2 = "Foo"}
);

此模式在将旧url重定向到新url时也很有用。例如:

routes.MapRoute(
 null, // Name
 "default.aspx", // redirect from old ASP.NET
 new { controller = "Redirect",
 action = "Index",
 controller2 = "Home",
 action2 = "Index" }
);