如何在asp.net mvc 3项目中路由.aspx页面?

时间:2012-04-16 13:36:08

标签: c# asp.net asp.net-mvc routing

我在以下路径中有一个.aspx页面:

Areas/Management/Views/Ticket/Report.aspx

我想在浏览器中将其路由到以下路径:

http://localhost/Reports/Tickets

我该怎么做?

我试试这个:

routes.MapRoute(
    "Tickets", // Route name
    "Areas/Management/Views/Ticket/Report.aspx", // Original URL
    new { controller = "Reports", action = "Tickets" } // New URL 
);

但我收到404错误。

我做错了什么?

Obs:我把它放在Default路线之前。

4 个答案:

答案 0 :(得分:22)

如果您正在尝试在MVC项目中使用Web表单,那么我会将.aspx移出views文件夹,因为它实际上不是视图,因此类似于WebForms / Tickets / Report.aspx。

在网络表单中,您可以通过调用MapPageRoute方法来映射路径。

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

您需要将其放在默认的MVC路由之前。

答案 1 :(得分:13)

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

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

public class MyCustomConstaint : 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 MyCustomConstaint() } }
);

答案 2 :(得分:-1)

你正在做相反的事情。这会将您的网址Areas/Management/Views/Ticket/Report.aspx映射到{controller = "Reports", action = "Tickets" } 你应该做的是 将网址设为为Reports/Tickets 编辑: - 您可以创建一个routeHandler,只是为了路由到这个.aspx页面..就像这样。

public class ASPXRouteHandler : IRouteHandler 
{ 
   public IHttpHandler GetHttpHandler(RequestContext requestContext) 
   { 

     return BuildManager.CreateInstanceFromVirtualPath("~/Areas/Management/Views/Ticket/Report.aspx",  typeof(Page)) as Page; 
   } 
}

然后你可以使用

将ur路由添加到现有路由表中
Route customRoute = new Route("Reports/Ticket",null, new ASPXRouteHandler()); 
      routes.Add(customRoute); 

答案 3 :(得分:-2)

如果在创建asp.net项目时保留默认路由

public class ReportsController : Controller
{
        public ActionResult Ticket()
        {
            return View();
        }        
}

这应该可以解决问题。 asp.net mvc中的路由意味着您不直接链接到 .aspx,而是链接到Actions(方法),而Actions又返回适当的视图( .aspx)