路由简化

时间:2010-11-24 09:01:32

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

我正在使用ASP.NET MVC3 RC1处理项目,并想知道我的路由是否可以简化。

我有这个控制器动作:

public ActionResult Things(DateTime? fromDate, DateTime? toDate, int? pageNo)
    {
        DataLayer dataLayer = new DataLayer();

        int page = pageNo.HasValue ? pageNo.Value : 1;

        List<Thing> things = dataLayer.GetThingsByDateRangePaged(User.Identity.Name, fromDate, toDate, pageNo, PageSize);

        return View(things);
    }

我希望能够通过以下网址访问此控制器操作:

  • 东西/第2页
  • 东西/ from11-14-2010 / to11-24-2010
  • 东西/ from11-14-2010 / to11-24-2010 /第2页

我目前已将这些路线映射出来:

routes.MapRoute("Things",
    "Things",
    new { controller = "Thing", action = "Things" }
    );

routes.MapRoute("ThingsPaged",
    "Things/Page{pageNo}",
    new { controller = "Thing", action = "Things" }
    );

routes.MapRoute("ThingsCertainPeriod",
    "Things/From{fromDate}/To{toDate}",
    new { controller = "Thing", action = "Things" }
    ); 

routes.MapRoute("ThingsCertainPeriodPaged",
     "Things/From{fromDate}/To{toDate}/Page{pageNo}",
     new { controller = "Thing", action = "Things" }
     );

在我看来,我的路线已经适合重构,但我并不完全确定如何摆脱冗余。 UrlParameter.Optional似乎没有像我在实验时所想的那样工作。我的路线可以简化为一条路线吗?

1 个答案:

答案 0 :(得分:1)

我认为你不能用相同的路线匹配/ page2和things / from11-14-2010 / ...因为只有在路径末尾有一个可选值才有意义。但是你可以把它减少到两条路线:

routes.MapRoute(
   "Thing1",
   "Thing/Thing/{from}/{to}/{page}",
   new { controller = "Thing", action = "Thing", page = 1 },
   new { from = @"(\d{1,2}-\d{1,2}-\d{4})?", to = @"(\d{1,2}-\d{1,2}-\d{4})?" }
);

routes.MapRoute(
   "Thing2",
   "Thing/Thing/{page}",
   new { controller = "Thing", action = "Thing", page = 1 },
   new { page = @"(\d*)?" }
);

您可以使用正则表达式约束来匹配参数,从而消除与前缀之间的页面。

您还可以通过在路径中设置页面(1)的默认值来简化控制器,这样它就不必是可空的。否则,您必须使用UrlParameter.Optional作为第一个路径中的页面值。