如何映射具有两个参数值的路由,其中​​第二个参数是可选的?

How to map route with two parameters value where the second parameter is optional?

我在路由映射方面遇到了问题。我有一个带有两个参数的 ActionResult,其中第一个参数(类别)是强制性的,第二个参数(页码)是可选的。现在我想绘制一条适用于 url.

的路线

1). http://example.com/Blog/Category/programming
2). http://example.com/Blog/Category/programming/1

其中 programming 是类别,/1 是页码。

这是我的 ActionResult:

public ViewResult Category(string category, int? p = 1)
{
    int pageNo = 1;
    if (p != null)
        pageNo = Convert.ToInt32(p);

    //other code    
    return View("Posts", myViewModel);
}

这是我的映射路线:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Blog", action = "Posts", id = UrlParameter.Optional }
    );

    //This route does not work    
    routes.MapRoute(
        "MyCategory",
        "Blog/Category/{category}/{p}",
        new { controller = "Blog", action = "Category", category = "", p = UrlParameter.Optional }
    );
}

现在,问题是当我尝试使用这两个参数导航页面时它工作正常。但是,当我尝试没有页面时,它给我错误 "Server not found."

我还阅读了一些 post,他们在其中提出了一些类似的解决方案。但是,id 还是不行。

Multiple optional parameters in MVC is not working

/Blog/Category/programming 匹配第一个路由(默认),在博客控制器上调用类别操作应该没有问题,除了 category 参数将为空,因为第三段默认路由是 id 参数,而不是 category。执行以下操作之一:

  • 将默认路由放在最后
  • category 参数重命名为 id