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

Posted

技术标签:

【中文标题】如何在 asp.net mvc 3 项目中路由 .aspx 页面?【英文标题】:How to route a .aspx page in asp.net mvc 3 project? 【发布时间】:2012-04-27 20:18:48 【问题描述】:

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

【问题讨论】:

您的页面是 .aspx 页面、web 表单 aspx 页面还是 mvc webforms 视图引擎页面? 您可以拥有使用 Web 表单视图引擎的 .aspx 视图,也可以拥有 .aspx Web 表单。我怀疑您正在尝试混合使用 Web 表单和 mvc,但目前还不清楚(至少对我而言)您要实现的目标。 我正在尝试在我的 asp.net mvc 项目中使用水晶报表。而且我正在尝试使用仅在 Web 表单中有效(具有完整功能)的 ReportViewer。所以,现在我只想将具有 ReportViewer 的 .aspx 页面路由为 mvc 视图(在 URL 的末尾没有 .aspx)。 【参考方案1】:

已解决!因此,我们需要在 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;
    

然后将Tickets路由更改为以下:

routes.MapPageRoute(
    "Tickets",
    "Reports/Tickets",
    "~/WebForms/Reports/Tickets.aspx",
    true, null, 
    new RouteValueDictionary   "outgoing", new MyCustomConstaint()  
);

【讨论】:

感谢 CodeHobo 提供此解决方案。 Reference 我是维克托。 @JabberwockyDecompiler 嗯,不知道我为什么放那个,你改名字了吗? 我在那里提出了同样的问题,所以,我把 CodeHobo 的答案放在这里。 “我是Vector”在那里。它只是一个别名,代号之类的东西^^。 我的朋友叫我 Jabber :D,哈哈,其实我是 TJ。【参考方案2】:

如果您尝试在 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 路由之前。

【讨论】:

当我运行项目时,浏览器会重定向到下面的 url “localhost:37538/Reports/…”。哦 猜测匹配默认路由,上面的行需要直接在routes.IgnoreRoute("resource.axd/*pathInfo")行之后 我把它直接放在routes.IgnoreRoute("resource.axd/*pathInfo") 之后,我得到了相同的网址。 =/ 我刚刚在一个新的 mvc 项目中尝试过,对我来说效果很好。您是直接将/Reports/Tickets 输入浏览器还是点击其他页面上的链接? 感谢您的建议。【参考方案3】:

你正在做相反的事情。这会将您的网址 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); 

【讨论】:

如果我把Reports/Tickets 放在网站将如何路由到我的aspx 页面? ull 必须创建一个路由处理程序.. 目前,您的 url 正在映射到明显存在的 Reports/Tickets .. 因此您得到 404。尝试从“Reports/Tickets”返回一个字符串,然后看看你哪里错了 老兄,我不想看到我错了。 “我错了”,好的,我知道(因为我在这里^^),现在我必须知道如何解决我的问题。 =) 一个代码,一个例子,一个链接... 我必须在defaults 中输入什么?在new CustomRouteHandler() 中,您的意思是new ASPXRouteHandler(),对吗? 当我运行项目时,浏览器会重定向到下面的 url “localhost:37538/Reports/…”。哦【参考方案4】:

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

public class ReportsController : Controller

        public ActionResult Ticket()
        
            return View();
                

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

【讨论】:

但是有了这个url(当我返回.aspx页面时)最后会有.aspx,不是吗? 不,不会。您是否实际测试过它(否决我)?我实际上已经更正了代码,所以它会返回localhost/Reports/Tickets 如果您尝试使用水晶报表,那么您应该检查这个答案***.com/questions/348785/… 我看到了。该页面正在运行(我已经在另一个项目中测试过),我现在的问题只是在 asp.net mvc 项目中路由它。 你的问题真的在 MVC 中吗,根据我从你以前的 cmets 收集到的信息,你有 webform 进行显示,所以也许你需要的是 IIS url 重写模块来处理这个特定的页面。 learn.iis.net/page.aspx/461/… 或者你有一个控制器在发送到你的视图之前处理请求吗?

以上是关于如何在 asp.net mvc 3 项目中路由 .aspx 页面?的主要内容,如果未能解决你的问题,请参考以下文章

asp.net MVC 路由

如何在多语言 asp.net MVC 网站的 URL 中支持有语言和无语言的路由

如何在 ASP.NET MVC 中使用路由修复 404?

ASP.NET MVC教程五:ASP.NET MVC中的路由

Angular 路由模板 url 是不是支持 ASP.Net MVC 5 项目中的 *.cshtml 文件?

混合 SPA 和 ASP.NET MVC 路由