2012-04-16 94 views
11

我在下面的路径中的.aspx页面中:如何在asp.net mvc 3项目中路由.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之前。

+0

您的.aspx页面,Web窗体aspx页面还是mvc webforms视图引擎页面? – 2012-04-16 13:44:52

+0

是.aspx页面。 – 2012-04-16 13:46:48

+0

你可以有。使用Web表单视图引擎的aspx视图,并且您可以使用.aspx Web表单。我怀疑你正在尝试混合使用Web表单和mvc来工作,但至少你还不清楚你正在努力达到的目标。 – 2012-04-16 13:51:48

回答

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() } } 
); 
+5

感谢CodeHobo提供此解决方案。 [参考](http://forums.asp.net/t/1793416.aspx/1) – JabberwockyDecompiler 2013-04-02 18:23:27

+0

我是Vecthor。 @JabberwockyDecompiler – 2017-08-22 13:42:19

+0

嗯,不知道为什么我把这个,你改变了你的名字? – JabberwockyDecompiler 2017-08-22 19:42:43

-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; 
    } 
} 

那么在哪里乌尔航线使用

Route customRoute = new Route("Reports/Ticket",null, new ASPXRouteHandler()); 
     routes.Add(customRoute); 
+0

如果我把'Reports/Tickets'如何将网站路由到我的aspx页面? – 2012-04-16 13:46:01

+0

ULL必须做出路由处理。目前乌尔网址是越来越映射到报告/门票这obsly dosent存在..因此乌尔获得404尝试从“报告/票”返回一个字符串,并ULL看到乌尔错 – 2012-04-16 13:48:04

+0

多德,我不想看到我错了。 “我错了”,好吧,我知道(这是因为我在这里^^),现在我必须知道如何解决我的问题。 =)一个代码,一个例子,一个链接... – 2012-04-16 13:51:42

-2

在创建asp.net项目

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

它添加到现有的路由表,如果您保留默认路由应该做的伎俩。 在asp.net mvc的路由意味着你不直接链接到的.aspx但操作(方法),然后再将返回相应的视图(的.aspx)

+0

但有了这个url(当我返回.aspx页面)将在最后有.aspx,不会? – 2012-04-16 13:57:14

+0

不,它不会。你真的测试过了,(投我票)?其实我已经纠正了代码,以便它会返回 的http://本地主机/报告/票 – coffeeyesplease 2012-04-16 14:00:57

+0

,如果你要使用水晶报表,那么你应该检查这个答案http://stackoverflow.com/questions/348785/crystal-reports -in-asp-net-mvc – coffeeyesplease 2012-04-16 14:17:15

21

如果你想利用Web表单在MVC项目中,我会将.aspx移出views文件夹,因为它不是一个真正的视图,所以就像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路由之前。

+0

当我运行该项目的浏览器重定向到URL folling的“http://本地主机:37538 /报告/票?行动=指数及控制器=登录”。吴 – 2012-04-16 14:19:20

+0

它在猜测相匹配的默认路由,线路上方需要'routes.IgnoreRoute后直接(“{}资源个.axd/{*} PATHINFO”)'行 – 2012-04-16 14:28:32

+0

我把那直接'路线之后。 IgnoreRoute(“{resource} .axd/{* pathInfo}”)'和我有相同的网址。 =/ – 2012-04-16 14:31:38