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

时间:2015-01-09 14:30:39

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

我在路线映射方面遇到了麻烦。我有一个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 }
    );
}

现在,问题是,当我尝试使用这两个参数导航页面时,它的工作正常。但是,当我尝试没有页面时没有它给我错误“找不到服务器。”

enter image description here

我也读了一些帖子,他们提出了这样的解决方案。但是,仍然id不起作用。

Multiple optional parameters in MVC is not working

1 个答案:

答案 0 :(得分:1)

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

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