使用类似的URL正确映射正确的路由到行动

时间:2014-12-07 21:18:14

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

我有两条必修路径:

1:localhost:1207 / Blog / 2014/12 / Article-Name

2:localhost:1207 / Blog / 2014/12

现在我为每条路线编写了自定义映射

1:

 routes.MapRoute(
            name: "BlogArticle",
            url: "blog/{year}/{month}/{title}",
            defaults: new
            {
                controller = "Blog", 
                action = "Detail", 
                year = UrlParameter.Optional, 
                month = UrlParameter.Optional, 
                title = UrlParameter.Optional
            }
        );

2:

routes.MapRoute(
            name: "BlogMonthList",
            url: "blog/{year}/{month}",
            defaults: new
            {
                controller = "Blog",
                action = "MonthList",
                year = UrlParameter.Optional,
                month = UrlParameter.Optional
            });

第二个不起作用,我不确定为什么。 作为答案的一部分,你能解释一下原因吗?

我的解决方案必须使用RouteConfig.cs

我的控制器示例:

public BlogController : Controller{
    public ActionResult MonthList(int year, int month)
    {
        var model = new MonthArticlesModel()
        {
            Year = year,
            Month = month            
        };

        return View(model);
    }

    public ActionResult Detail(int year, int month, string title)
    {
        var model = new DetailModel();
        return View(model);
    }

}

1 个答案:

答案 0 :(得分:1)

问题在于无法区分路线,因为您已将所有参数设为可选,且/Blog/2014/12/Article-Name/Blog/2014/12都与第一条路线匹配。

我建议您遵循更多传统路线,但是您可以通过将路线指定为

来完成此工作
routes.MapRoute(
  name: "BlogMonthList",
  url: "blog/{year}/{month}",
  defaults: new { controller = "Blog", action = "MonthList" }
);

routes.MapRoute(
  name: "BlogArticle",
  url: "blog/{year}/{month}/{title}",
  defaults: new { controller = "Blog", action = "Detail" }
);

然后/Blog/2014/12/Article-Name会跳过第一条路线(只接受2个参数)并重定向到Detail(int year, int month, string title),但/Blog/2014/12会匹配第一条路线并重定向到MonthList(int year, int month)