c# MVC路由——多路由

本文关键字:路由 多路 MVC | 更新日期: 2023-09-27 18:18:36

我有一个默认的c# mvc路由:

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}"
    new { controller = "Home", action = "Index", id = "Welcome" }
);

现在我会得到这样的url:

mysite.com/Home/Index/Page1
mysite.com/Home/Index/Page2
mysite.com/Home/Index/Page3
mysite.com/Account/Login
mysite.com/Account/Etc

但是我想让第一个集的url更短,比如:

mysite.com/Page1
mysite.com/Page2
mysite.com/Page3
mysite.com/Account/Login
mysite.com/Account/Etc

我期望代码非常简单,如:

routes.MapRoute(
    "Shorturl",
    "{id}",
    new { controller = "Home", action = "Index", id = "Welcome" } 
);
routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}"
    new { controller = "Home", action = "Index", id = "Welcome" }
);

但这不起作用。它只会走第一条路,而忘记第二条路。当只有一个参数(例如?)时,如何使程序采用第一条路径mysite.com/Page1),当你有多条路线时,选择第二条路线(如mysite.com/Account/Login) ?

编辑:我可以:

routes.MapRoute("Short", "short/{id}", new { controller = "Home", action = "Indx", id = "Page1" } );

但是这样我就会在url中有一个丑陋的"短/"。我可以修改:

routes.MapRoute("Page1", "Page1", new { controller = "Home", action = "Index", id = "Page1" } );

但是我需要手动添加每个新页面…

c# MVC路由——多路由

您可能想尝试这样做。

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute(
            "Short", // Route name
            "{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );
        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );
    }

确保你把这个添加到路由的默认值之前(如果你想的话,甚至可以删除默认值)

但是它们的添加顺序很重要。

有一个信息丢失了,那就是控制器中的Action。

public ActionResult Index(string id)
{
      ViewBag.Message = "Welcome to ASP.NET MVC!"+id;
      return View();
}

希望对你有帮助。

问候。