Używam następującego artykułu Addition to ASP.NET MVC Localization - Using routing do obsługi tras wielokulturowych.Dlaczego otrzymuję wyjątek "Publiczna metoda działania nie została znaleziona na kontrolerze"?
Jeśli spojrzysz na sekcję "Rejestrowanie tras", zobaczysz, że aktualne trasy są aktualizowane (w metodzie "RegisterRoutes") segmentem "{culture}".
Różnica polega na tym, że chcę zachować obecne trasy i dodać duplikat dla każdego z segmentu "{culture}", więc dla trasy takiej jak "foo/bar" otrzymam duplikat "{culture}/foo/bar ".
Widać, że upewniam się również, że nowa trasa jest najważniejsza.
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);
}
}
W "InheritedRoutesProvider" wygląda następująco:
private class InheritedRoutesProvider : DefaultDirectRouteProvider
{
protected override IReadOnlyList<IDirectRouteFactory> GetActionRouteFactories(ActionDescriptor actionDescriptor)
{
return actionDescriptor.GetCustomAttributes(typeof(IDirectRouteFactory), true)
.Cast<IDirectRouteFactory>()
.ToArray();
}
}
Mój kontroler wygląda następująco:
public class MyBaseController: Controller
{
[HttpGet]
[Route("bar")]
public virtual ActionResult MyAction(){
{
return Content("Hello stranger!");
}
}
[RoutePrefix("foo")]
public class MyController: MyBaseController
{
}
Mój "RegisterRoutes" metoda wygląda następująco:
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapMvcMultiCultureAttributes();
routes.LowercaseUrls = true;
}
Teraz, jeśli to zrobię:
- /foo/bar - DZIAŁA!
- /pl/foo/bar - HttpException Sposób działania publiczne „MyAction” nie został odnaleziony na kontrolerze „MyController”
Jaka jest zawartość metody "RegisterRoutes". –
@RezaAghaei Zaktualizowano. – Dan
Gdzie zadeklarowałeś domyślną trasę? –