6

我正在尝试在我的 asp.net mvc 项目中路由一个 .aspx(webforms 页面)。我在 global.asax 中注册页面:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapPageRoute("Tickets", "Reports/Tickets", "~/WebForms/Reports/Tickets.aspx");
routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional });

问题是,在我添加第二行之后,站点停止进入我的主控制器(索引操作)并重定向到:http://localhost:37538/Reports/Tickets?action=Index&controller=Login%22总是我运行项目。

项目详情:

  • ASP.NET MVC 3
  • 表单认证
  • .Net 4.0

Obs:要重现此错误,创建一个新的 asp.net mvc 项目作为互联网应用程序,在文件夹Tickets内创建 webforms 页面后/WebForms/Reports,并注册新路由。运行项目(可能您已登录),所以现在注销,您将被重定向到http://localhost:35874/Reports/Tickets?action=LogOff&controller=Account,那为什么呢?

4

1 回答 1

12

解决了!因此,我们需要为 webforms 路由添加一个路由约束,以确保它只捕获传入路由,而不是生成传出路由。

将以下类添加到您的项目中(在新文件中或 global.asax.cs 的底部):

public class MyCustomConstraint : IRouteConstraint{
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection){
        return routeDirection == RouteDirection.IncomingRequest;
    }
}

然后将门票路线更改为以下内容:

routes.MapPageRoute(
    "Tickets",
    "Reports/Tickets",
    "~/WebForms/Reports/Tickets.aspx",
    true, null, 
    new RouteValueDictionary { { "outgoing", new MyCustomConstraint() } }
);
于 2012-04-16T17:31:56.523 回答