5

我正在尝试使用 system.web.routing (不幸的是我不能使用 iis 重写/路由)。我尝试了以下方法,但结果为 404。如果我要指向另一个物理文件(用于测试目的),路由工作正常。

void RegisterRoutes(RouteCollection routes)
{
    routes.RouteExistingFiles = true;
    routes.MapPageRoute("about", "about/us", "~/about/company", false);
}

那么,是否可以指向这样的项目?

4

3 回答 3

1

希望这会对您有所帮助,此特定示例适用于 Sitecore,但该项目是开源的,我想重新利用您的解决方案所需的部件不会太困难。

这个项目的要点是允许您将 MVC 路由引擎与 webforms 解决方案一起使用。我将补充一点,您需要深入研究代码,但希望能让您走上正确的轨道。

https://github.com/Sitecore/Sitecore-Mvc-Routing

于 2012-07-30T09:16:47.530 回答
1

您将无法使用 MapPageRoute 实现您想要的目标。MapPageRoute 通过使用 PageRouteHandler 创建一个新路由来工作。PageRouteHandler 类的文档特别指出:

您将 PageRouteHandler 的实例传递给 Route 构造函数,以便映射物理文件的 URL。PageRouteHandler 对象指定物理文件的虚拟路径,并确定是否检查物理 URL 的授权规则。

如果这是一个 MVC 应用程序,则RouteCollectionExtensions 类中有路由扩展。您应该能够使用该MapRoute方法并为其提供必要的默认参数,以使用 MvcRouteHandler 创建新的 Route,如下所示:

routes.MapRoute("about", "about/us", new { controller = "about", action="company", id="" });

您需要输入适当的值,因为我不知道您的控制器设计。此外,请查看创建自定义路由 (C#),这可能有助于理解 MVC 如何处理路由。

如果这不是 MVC 应用程序,则必须实现从UrlRoutingHandler 类派生的自定义路由处理程序,并将新路由添加到 RouteCollection。

于 2012-07-27T17:45:19.090 回答
1

为了像/content/something您一样路由到无扩展目标,需要在 IIS 应用程序池中使用集成模式。如果您无法更改此设置,那么除了设置自定义 404 处理程序并从那里手动处理 URL 之外,没有简单的方法可以做您想做的事情。这可能是您的 404 错误的原因。

另外,RouteExistingFiles应该是假的。您正在尝试路由不作为文件存在的东西。如果您设置RouteExistingFiles = true,那么当路由匹配时,将不会使用对现有文件的默认处理。您要做的就是处理不存在但代表数据库内容的路径,对吗?所以留下这个错误。

最后,您的MapPageRoute陈述似乎不正确。例如,在 Microsoft 的演练中,它可能看起来像:http: //msdn.microsoft.com/en-us/library/dd329551.aspx

routes.MapPageRoute("SalesRoute",
    "SalesReport/{locale}/{year}",
    "~/sales.aspx");

这将导致调用匹配sales.aspx的路由作为响应。在您的示例中,目标~/about/company看起来像一条路线,而不是实际目标 - 您处理 CMS 请求的实际目标应该具有aspx扩展名。

于 2012-07-28T04:29:44.160 回答