Упрощение маршрутизации - PullRequest
1 голос
/ 24 ноября 2010

Я работаю над проектом, использующим 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);
    }

Я бы хотел получить доступ к этому действию контроллера по следующим URL:

  • вещи
  • вещи / стр.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 Ответ

1 голос
/ 24 ноября 2010

Я не думаю, что вы можете сопоставить вещи / страницы2 и вещи / из 11-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 для значения страницы в первом маршруте.

...