Я использую следующую статью Addition to ASP.NET MVC Localization - Using routing для поддержки маршрутов с несколькими культурами.Почему я получаю исключение «Открытый метод действия не найден на контроллере»?
Если вы посмотрите раздел «Регистрация маршрутов», вы увидите, что текущие маршруты обновляются (в методе «RegisterRoutes») с сегментом «{культура]».
Разница в том, что я хочу сохранить текущие маршруты и добавить дубликат для каждого из них с сегментом «{культура]», поэтому для маршрута, такого как «foo/bar», я получаю дубликат «{culture}/Foo/бар».
Вы можете видеть, что я также уверен, что новый маршрут на первом месте.
public static void MapMvcMultiCultureAttributes(this RouteCollection routes, bool inheritedRoutes = true, string defaultCulture = "en-US", string cultureCookieName = "culture")
{
routes.MapMvcAttributeRoutes(inheritedRoutes ? new InheritedRoutesProvider() : null);
var multiCultureRouteHandler = new MultiCultureMvcRouteHandler(defaultCulture, cultureCookieName);
var initialList = routes.ToList();
routes.Clear();
foreach (var routeBase in initialList)
{
var route = routeBase as Route;
if (route != null)
{
if (route.Url.StartsWith("{culture}"))
{
continue;
}
var cultureUrl = "{culture}";
if (!String.IsNullOrWhiteSpace(route.Url))
{
cultureUrl += "/" + route.Url;
}
var cultureRoute = routes.MapRoute(null, cultureUrl, null, new
{
culture = "^\\D{2,3}(-\\D{2,3})?$"
});
cultureRoute.Defaults = route.Defaults;
cultureRoute.DataTokens = route.DataTokens;
foreach (var constraint in route.Constraints)
{
cultureRoute.Constraints.Add(constraint.Key, constraint.Value);
}
cultureRoute.RouteHandler = multiCultureRouteHandler;
route.RouteHandler = multiCultureRouteHandler;
}
routes.Add(routeBase);
}
}
"InheritedRoutesProvider" выглядит следующим образом:
private class InheritedRoutesProvider : DefaultDirectRouteProvider
{
protected override IReadOnlyList<IDirectRouteFactory> GetActionRouteFactories(ActionDescriptor actionDescriptor)
{
return actionDescriptor.GetCustomAttributes(typeof(IDirectRouteFactory), true)
.Cast<IDirectRouteFactory>()
.ToArray();
}
}
Мой контроллер выглядит следующим образом:
public class MyBaseController: Controller
{
[HttpGet]
[Route("bar")]
public virtual ActionResult MyAction(){
{
return Content("Hello stranger!");
}
}
[RoutePrefix("foo")]
public class MyController: MyBaseController
{
}
Мой метод "RegisterRoutes" выглядит следующим образом:
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapMvcMultiCultureAttributes();
routes.LowercaseUrls = true;
}
Теперь, если да:
- /foo/bar - РАБОТЫ!
- /EN-US/Foo/бар - HttpException метод общественного действия «MyAction» не найден на контроллере «MyController»
В чем заключается ваше содержание метода "RegisterRoutes'. –
@RezaAghaei Обновлено. – Dan
Где вы объявляли маршрут по умолчанию? –