【问题标题】:How to route a .aspx page in asp.net mvc 3 project?如何在 asp.net mvc 3 项目中路由 .aspx 页面?
【发布时间】: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)。

标签: c# asp.net asp.net-mvc routing


【解决方案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
  • 如果您尝试使用水晶报表,那么您应该检查这个答案stackoverflow.com/questions/348785/…
  • 我看到了。该页面正在运行(我已经在另一个项目中测试过),我现在的问题只是在 asp.net mvc 项目中路由它。
  • 你的问题真的在 MVC 中吗,根据我从你以前的 cmets 收集到的信息,你有 webform 进行显示,所以也许你需要的是 IIS url 重写模块来处理这个特定的页面。 learn.iis.net/page.aspx/461/… 或者你有一个控制器在发送到你的视图之前处理请求吗?
猜你喜欢
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-13
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 1970-01-01
相关资源
最近更新 更多