2011-01-31 5 views
0

Я новичок в ASP.Net MVC. Может быть, этот вопрос выглядит просто, но я не мог это исправить. Вот сценарий. У меня есть список данных, основанных на городе. Таким образом, URL будет смотреть, как этотДинамическая проблема маршрутизации ASP.Net

 www.xxxxxx.in/chennai 
     www.xxxxxx.in/mumbai 
     www.xxxxxx.in/delhi 

В нормальной маршрутизации первой части (Ченнай/Mumbai) является контроллер в приведенном выше URL, но здесь я не хочу, чтобы это контроллер. вместо этого я хочу сопоставить один контроллер (LocationController) с этими URl. Потому что позже я могу добавить любое количество городов.

Меня поразило, может кто-то мне помочь.

ответ

2

Попробуйте это:

routes.MapRoute(
      "CityRoute",            // Route name 
      "{city}",       // URL with parameters 
      new { controller = "Location", action = "Index", city = "" } // Parameter defaults 
     ); 
+0

Я пытался, как вы сказали. Но его не работает ... – RameshVel

+0

@Ramesh: Что значит, что он не работает? Вы все еще используете исходное определение маршрута?У вас есть действие контроллера со строковым параметром с именем 'city'? Это определенно работает. Вы, должно быть, делаете что-то неправильно. –

+0

@Robert Koritnik, да, я использовал оригинальное определение вместе с этим ... Я изучаю ваш ответ. Я изменюсь, если это проблема ... – RameshVel

0

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

routes.MapRoute(
    "location", // Route name 
    "{cityName}", // URL with parameters 
    new { controller = "location", action = "index" } // Parameter defaults 
); 

routes.MapRoute(
    "Location", // Route name 
    "{controller}/{action}/{cityName}", // URL with parameters 
    new { controller = "Location", action = "index"} // Parameter defaults 
) 

Это будет маршрут все запросы вида «/ Mumbai» в LocationController метод действия Index с параметром cityName установлен в "mumbai". Он также сможет маршрутизировать полный контроллер/действие с использованием второго маршрута.

+0

его не работает ... – RameshVel

+0

Это, конечно, не правильный маршрут, потому что он будет работать как: 'www.xxxxxx.in/location/index/mumbai', и это не то, что он хочет. –

+0

@Robert Koritnik Он будет работать, если это единственный маршрут, определенный. Структура заменит значения по умолчанию, когда они не будут предоставлены И позволит явный URL-адрес контроллера/действия/параметра. –

1

Я не уверен, что не будет более легкого варианта, чем это, но вы можете попробовать это - используя ограничение маршрута. В принципе, вам нужно знать список городов, которые у вас есть, а затем ограничивать маршрут, чтобы соответствовать только записи в этом списке.

Маршрут ограничение может быть реализовано следующим образом

public class CityConstraint : IRouteConstraint 
{ 
    public static IList<string> CityNames = (Container.ResolveShared<ICityService>()).GetCities(); 

    bool _IsCity; 
    public CityConstraint(bool IsCity) 
    { 
     _IsCity = IsCity;    
    } 

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     if (_IsCity) 
      return CityNames.Contains(values[parameterName].ToString().ToLower()); 
     else 
      return !CityNames.Contains(values[parameterName].ToString().ToLower()); 
    } 
} 

А затем положить маршрут следующим образом:

routes.MapRoute("Location", "{cityName}", new { controller = "LocationController", action = "Index" }, new { cityName = new CityConstraint(true) }); 

Также убедитесь, что выше маршрут в списке перед маршрутом по умолчанию

routes.MapRoute("Default", // Route name 
       "{controller}/{action}/{id}", // URL with parameters 
       new { controller = "Home", action = "Index", id = UrlParameter.Optional 
      ); 

Также обратите внимание, что имя контроллера не может быть именем города.

Попробуйте это и посмотрите.

+0

s, спасибо за прекрасную идею .. ее интересно :) – RameshVel

+0

Возможно, лучше изменить порядок маршрутизации и установить ограничение имени контроллера по умолчанию, потому что есть конечное число определенных контроллеров, а города, скорее всего, являются динамическими, определенными в база данных. Таким образом, маршрут по умолчанию с ограничением сначала, а затем маршрут местоположения. –

+0

Реверсирование также означает, что нет необходимости в настраиваемом классе ограничений. Вы можете легко использовать встроенные функции ограничения. –

1

Если все ваши маршрутизации связаны с этими городами, чем удалить маршрут по умолчанию и заменить его с этим определением маршрута:

routes.MapRoute(
    "Default", 
    "{city}", 
    new { controller = "Location", action = "Index", city = "Mumbai" } 
); 

Затем создать LocationController класс:

public class LocationController : Controller 
{ 
    public ActionResult Index(string city) 
    { 
     // do whatever needed; "city" param has the city specified in URL route 
    } 
} 

Если вы по-прежнему нужна ваша по умолчанию маршрут (контроллер/действие/id) для других страниц не только городов, то, вероятно, лучше установить ограничение на свой маршрут по умолчанию и определить их следующим образом:

routes.MapRoute(
    "Default", 
    "{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
    new { controller = "Home|...|..." } // put all controllers here except "Location" 
); 
routes.MapRoute(
    "Location", 
    "{city}", 
    new { controller = "Location", action = "Index", city = "Mumbai" } 
); 

Это приведет к тому, что другие контроллеры все еще работают, и местоположение будет работать так же хорошо. Проблема, конечно, в том, что есть название города, которое совпадает с именем одного из ваших обычных контроллеров. :) Но вы можете контролировать и избегать этого.

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