2015-09-29 2 views
0

Как можно определить маршрут в ASP.NET MVC 5, который будет игнорировать статические префиксы/суффиксы (например, "zip-", "-county") для необязательных параметров, если последние не установлены?ASP.NET MVC Пользовательский необязательный параметр

Так что в данном случае, например:

routes.Add("Search", 
    new LowercaseDashedRoute(
    "search/{searchType}/{state}/{county}-county/{city}", 
    new RouteValueDictionary(new { 
     controller = "Home", 
     action = "Search",    
     county = UrlParameter.Optional, 
     city = UrlParameter.Optional }), 
    new RouteValueDictionary(new { searchType = searchTypeConstraint }), 
    new LowercaseDashedRouteHandler())); 

когда county отсутствует в URL будет как /search/sale/ca/los-angeles но не/search/sale/ca/-county/los-angeles

ответ

0

Вы можете установить ограничение для параметра округа, а затем создать другой маршрут без него:

routes.Add("Search", 
    new LowercaseDashedRoute(
    "search/{searchType}/{state}/{county}/{city}", 
    new RouteValueDictionary(new { 
     controller = "Home", 
     action = "Search",    
     county = UrlParameter.Optional, 
     city = UrlParameter.Optional }), 
    new RouteValueDictionary(new { searchType = searchTypeConstraint, county="\\S+-county" }), 
    new LowercaseDashedRouteHandler())); 

Маршрут 2:

routes.Add("Search", 
    new LowercaseDashedRoute(
    "search/{searchType}/{state}/{city}", 
    new RouteValueDictionary(new { 
     controller = "Home", 
     action = "Search", 
     city = UrlParameter.Optional }), 
    new RouteValueDictionary(new { searchType = searchTypeConstraint }), 
    new LowercaseDashedRouteHandler())); 

Недостатком является то, что «-county» суффикс будет добавлен параметр, но вы можете легко справиться с этим в контроллере.

0

Невозможно иметь 2 необязательных параметра на одном маршруте или объединить необязательный параметр с литеральной частью в сегменте.

Однако, чтобы получить желаемый эффект, вы можете просто добавить еще один маршрут для обработки дела без уезда (и удалить графство в качестве необязательного параметра).

// Matches: 
//  /search/sale/ca/los-angeles-county/los-angeles 
//  /search/sale/ca/los-angeles-county 
routes.Add("SearchCounty", 
    new LowercaseDashedRoute(
    "search/{searchType}/{state}/{county}-county/{city}", 
    new RouteValueDictionary(new { 
     controller = "Home", 
     action = "Search",    
     city = UrlParameter.Optional }), 
    new RouteValueDictionary(new { searchType = searchTypeConstraint }), 
    new LowercaseDashedRouteHandler())); 

// Matches: 
//  /search/sale/ca/los-angeles 
routes.Add("Search", 
    new LowercaseDashedRoute(
    "search/{searchType}/{state}/{city}", 
    new RouteValueDictionary(new { 
     controller = "Home", 
     action = "Search" }), 
    new RouteValueDictionary(new { searchType = searchTypeConstraint }), 
    new LowercaseDashedRouteHandler())); 

Двигатель маршрутизации соответствует только первому маршруту, если <something>-county передается в качестве 4-го сегмента, так что он будет в состоянии отличить этот случай от просто передавая city аргумент.

Смежные вопросы