【发布时间】:2014-02-14 16:05:36
【问题描述】:
我有两个区域注册路由,如下所示:
“网站”区域:
context.MapRoute(
"Landing Controllers",
"{controller}/{action}",
new { controller = "Home", action = "Index" }
);
“移动”区域:
context.MapRoute(
"Mobile Defaults",
"{controller}/{action}",
new { controller = "MobileHome", action = "Index" },
new { controller = "MobileHome", action = "Index" }
);
默认情况下,当尝试转到根 URL / 时,将始终采用这些路由中的一个或另一个。但是假设我们用自定义的AuthorizeAttribute 修饰了我们的控制器操作,其中OnAuthorization 方法被覆盖以在适当的时候将用户重定向到正确的控制器,如下所示。 (想法来自伟大的blog post。)
public class MobileRedirectAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
var result = // Logic to generate the ActionResult that conditionally
// takes us to the other route goes here.
filterContext.Result = result;
}
}
我尝试使用新的RedirectResult 和RedirectToRouteResult,由于路由冲突,这两种方法都无法正常工作。有没有办法将AuthorizationContext.Result 设置为一个可以将我们带到我们当前未执行的操作的值? (作为最后的手段,我可以在移动路由前加上某种命名空间变量,但我想避免走这条路。)
我的问题也可以通过查看维基百科的桌面/移动路由来总结。他们的两个站点,http://en.m.wikipedia.org/wiki/Main_Page 和 http://en.wikipedia.org/wiki/Main_Page 也共享相同的路由,但是,根据您所处的模式,返回的结果非常不同。
是否可以在 MVC 项目中设置 Wikipedia 的路由,其中每个环境(移动/桌面)都注册在自己的区域中?
【问题讨论】:
-
您真的需要为移动设备和非移动设备使用不同的控制器吗?还是只是单独的视图就足够了?
-
@EugeneBrianOng 是的,它们的功能之间的差异足以保证单独的控制器。
标签: c# asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing