重定向到另一个未在路由中注册的控制器/动作
本文关键字:注册 控制器 动作 路由 另一个 重定向 | 更新日期: 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" }
);