如何在ASP.NET MVC 3项目中路由一个.aspx页面?

16

我有一个位于以下路径的.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 错误。

我做错了什么?

备注:我把它放在了Default路由之前。


你的.aspx页面是Web Forms aspx页面还是MVC WebForms视图引擎页面? - Chris Diver
你可以使用Web Forms视图引擎创建.aspx视图,也可以创建.aspx Web Forms。我猜你想让Web Forms和MVC混合使用,但至少对我来说不太清楚你想实现什么。 - Chris Diver
我正在尝试在我的asp.net mvc项目中使用crystal reports。我正在尝试使用一个ReportViewer,但它只能在web forms中完全支持所有功能。因此,现在我只想将具有ReportViewer的.aspx页面路由为mvc视图(URL结尾没有.aspx)。 - Vinicius Ottoni
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路由之前。

当我运行项目时,浏览器会重定向到以下网址:“http://localhost:37538/Reports/Tickets?action=Index&controller=Login”。嗯。 - Vinicius Ottoni
在您的项目中加入表单身份验证,如果您尝试访问根页面,则会重定向到此URL(如果用户未登录,则在web.config中阻止所有路径)。 - Vinicius Ottoni
我不能只使用PDF。我需要使用ReportViewer。 - Vinicius Ottoni
当您运行项目时,您已经登录了吗?如果是,请尝试注销,然后您将会看到(我也在一个单独的项目中进行了测试)。 - Vinicius Ottoni
1
谢谢您的建议。 - Anup Sharma
显示剩余7条评论

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

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

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

6
感谢CodeHobo提供的解决方案。 [参考链接] (http://forums.asp.net/t/1793416.aspx/1) - JabberwockyDecompiler
我是Vecthor。@JabberwockyDecompiler - Vinicius Ottoni
嗯,不确定为什么我会这样写,你改了名字吗? - JabberwockyDecompiler
我在那里提出了同样的问题,所以我把CodeHobo的答案放在这里。“我是Vecthor”在那里。这只是一个别名,代号之类的东西^^。 - Vinicius Ottoni
我的朋友们叫我Jabber :D,哈哈,实际上我用TJ。 - JabberwockyDecompiler

-1

你做反了。这将你的URL映射到Areas/Management/Views/Ticket/Report.aspx,对应的是{ controller = "Reports", action = "Tickets" }
你应该做的是将URL设置为
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); 

你需要创建一个路由处理程序。目前你的URL被映射到Reports/Tickets,但这个路径明显不存在,因此你会得到404错误。试着从“Reports/Tickets”返回一个字符串,你就能看出问题所在了。 - Parv Sharma
defaults 中我需要放什么?而且在 new CustomRouteHandler() 里,你想表达的是 new ASPXRouteHandler(),对吗? - Vinicius Ottoni
当我运行项目时,浏览器会重定向到以下网址:“http://localhost:37538/Reports/Tickets?action=Index&controller=Login”。嗯。 - Vinicius Ottoni
你是否已经设置某种验证方式,如表单验证? - Parv Sharma
兄弟,我不明白你说的是什么。"awsm"是什么意思?另外,你知道吗,只有登录用户才能访问这个页面“报告/票务”。 - Vinicius Ottoni
显示剩余3条评论

-2

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

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

这应该能解决问题。 在ASP.NET MVC中的路由意味着您不直接链接到.aspx,而是链接到相应视图(.aspx)返回的操作(方法)。


但是这样做,URL(当我返回.aspx页面时)末尾会有.aspx,不是吗? - Vinicius Ottoni
不,它不会。你实际上测试过吗(给我投反对票)?我已经纠正了代码,因此它将返回http://localhost/Reports/Tickets。 - coffeeyesplease
如果您正在尝试使用Crystal Reports,则应检查此答案https://dev59.com/XnRC5IYBdhLWcg3wSu97 - coffeeyesplease
我看到了。这个页面是可以工作的(我在另一个项目中测试过),我的问题现在只是如何在ASP.NET MVC项目中路由它。 - Vinicius Ottoni
这个怎么样:http://www.hanselman.com/blog/PlugInHybridsASPNETWebFormsAndASPMVCAndASPNETDynamicDataSideBySide.aspx - coffeeyesplease
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接