我正在使用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);
}
我希望能够通过以下网址访问此控制器操作:
我目前已将这些路线映射出来:
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似乎没有像我在实验时所想的那样工作。我的路线可以简化为一条路线吗?
答案 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作为第一个路径中的页面值。