15

我在以下路径中有一个 .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

4 回答 4

22

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

在 Web 表单中,您通过调用该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 路由之前。

于 2012-04-16T13:59:46.497 回答
14

解决了!因此,我们需要为 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() } }
);
于 2012-04-16T17:33:59.690 回答
-1

你正在做相反的事情。这会将您的 url 映射Areas/Management/Views/Ticket/Report.aspx到 {您controller = "Reports", action = "Tickets" }
应该做的是将 url 设置为
Reports/Tickets EDIT:- 您可以创建一个 routeHandler 仅用于路由到此 .aspx 页面.. 像这样。

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

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

然后您可以使用将您的路线添加到现有路线表中

Route customRoute = new Route("Reports/Ticket",null, new ASPXRouteHandler()); 
      routes.Add(customRoute); 
于 2012-04-16T13:44:16.070 回答
-2

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

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

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

于 2012-04-16T13:48:14.280 回答