Я не уверен, что не будет более легкого варианта, чем это, но вы можете попробовать это - используя ограничение маршрута. В принципе, вам нужно знать список городов, которые у вас есть, а затем ограничивать маршрут, чтобы соответствовать только записи в этом списке.
Маршрут ограничение может быть реализовано следующим образом
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
);
Также обратите внимание, что имя контроллера не может быть именем города.
Попробуйте это и посмотрите.
Я пытался, как вы сказали. Но его не работает ... – RameshVel
@Ramesh: Что значит, что он не работает? Вы все еще используете исходное определение маршрута?У вас есть действие контроллера со строковым параметром с именем 'city'? Это определенно работает. Вы, должно быть, делаете что-то неправильно. –
@Robert Koritnik, да, я использовал оригинальное определение вместе с этим ... Я изучаю ваш ответ. Я изменюсь, если это проблема ... – RameshVel