如何在 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 网站的 URL 中支持有语言和无语言的路由
ASP.NET MVC教程五:ASP.NET MVC中的路由