在ASP.NET MVC中,如何从/ somepage重写到/ pages / showpage / somepage?

时间:2009-11-04 16:17:15

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

如何重写网址:/ SomePage to / Pages / ShowPage / SomePage?

我试过了:

            routes.MapRoute("myroute", "{id}", new { controller = "Pages", action = "ShowPage" });

但它不起作用。我做错了什么?

5 个答案:

答案 0 :(得分:1)

如果您尝试说“导航到/SomePage会拨打PagesController.ShowPage("SomePage")”,那么您可能想要这样:

// Find a method with signature PagesController.ShowPage( string param )
// and call it as PagesController.ShowPage("SomePage")
route.MapRoute(
    "MyRoute",
    "SomePage",
    new { controller = "Pages", action = "ShowPage", param = "SomePage" } );

这将重定向确切的网址/SomePage。如果您尝试说“导航到/{something}将运行PagesController.ShowPage( something )方法”,那么这是一个更难的问题。

如果第二种情况确实是您想要的,那么您必须在大多数其他路线之后定义它。您想要的路由条目是:

// This will call the method PagesController.ShowPage( string param )
route.MapRoute(
    "MyRoute",
    "{param}",
    new { controller = "Pages", action = "ShowPage" } );

答案 1 :(得分:0)

我认为这应该是:

routes.MapRoute("myroute", "{controller}/{action}/{id}", new { controller = "Pages", action = "ShowPage", id = "SomePage" });

答案 2 :(得分:0)

这是错误的,因为我认为在你的应用程序中,有这个默认的地图路线:

routes.MapRoute(
            "root",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );

它将查找名称等于您传入的ID的控制器,如果删除此默认地图路线,您的地图路线将起作用。

你应该试试这个路由调试工具,它有很多帮助:

Debugger Tool

答案 3 :(得分:0)

您需要确保您的路线映射到您的对象。在您的情况下,您需要一个名为PagesController的控制器,其中包含一个名为ShowPage的方法,其中包含一个名为pagename的参数(如果您使用如下所示的路由)。

routes.MapRoute("route", "{controller}/{action}/{pagename}", new { controller = "Pages", action = "ShowPage", pagename = "" }  );

此外,请不要忘记在指定路由时可以使用正则表达式 - 这可以帮助您确保路由引擎使用正确的路由。

routes.Add(new Route("{controller}/{action}/{params}",
    new RouteValueDictionary { { "controller", "user" }, { "action", "login" }, { "params", "" } },
    new RouteValueDictionary { { "controller", @"^(?!Resources)\w*$" }, { "action", "[a-zA-Z]+" } },
    new MvcRouteHandler()));

答案 4 :(得分:0)

您可以编写自己的静态路由。在默认路线上方添加您自己的路线。

routes.MapRoute("MyRoute",                                              // Route name            
    "Pages/ShowPage/SomePage/{id}",                           // URL with parameters            
    new { controller = "Pages", action = "ShowPage", id = "" }  // Parameter defaults        
);

现在,如果SomePage是一个变量,你会想要这样的东西:

routes.MapRoute("MyRoute",                                              // Route name            
    "Pages/ShowPage/{somePage}/{id}",                           // URL with parameters            
    new { controller = "Pages", action = "ShowPage", id = "", somePage = "" }  // Parameter defaults        
);

如果需要,可以省略{id},只需将其从动作参数中删除。

routes.MapRoute("MyRoute",                                              // Route name            
    "Pages/ShowPage/{somePage}",                           // URL with parameters            
    new { controller = "Pages", action = "ShowPage", somePage = "" }  // Parameter defaults        
);