【发布时间】:2016-02-01 18:38:21
【问题描述】:
我正在使用下面的文章Addition to ASP.NET MVC Localization - Using routing来支持多文化路线。
如果您查看“注册路线”部分,您会看到当前路线已更新(在“RegisterRoutes”方法中)使用“{culture}”部分。
不同之处在于我想保留当前路线并为每个带有“{culture}”段的路线添加一个副本,因此对于像“foo/bar”这样的路线我会得到一个重复的“{culture}/ foo/bar"。
你可以看到我也在确保新路线排在第一位。
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/bar - HttpException 在控制器“MyController”上找不到公共操作方法“MyAction”
【问题讨论】:
-
你的
RegisterRoutes方法内容是什么。 -
@RezaAghaei 已更新。
-
你在哪里声明了默认路由?
-
没有默认路由,我只依赖属性(我不想要带有默认值的经典控制器/动作路由)。
-
糟糕,没有看到那个控制器。
标签: c# asp.net-mvc exception routing