使用RouteLocalization.Mvc使用action参数转换路由

时间:2016-06-15 13:17:00

标签: c# asp.net-mvc asp.net-mvc-routing asp.net-mvc-5.2 attributerouting

使用此示例:

[Route("MyActionWithStringParameter/{parameter}")]
ActionResult MyAction(string parameter)

.ForAction(x => x.MyAction(), new [] { typeof(string) })

来自RouteLocalization.Mvc的GitHub文档。 https://github.com/Dresel/RouteLocalization/blob/master/Documentation/SelectingAndTranslatingRoutes.md

我无法让自己的代码工作。

这是我的默认路线:

[Route("~/{slug:regex((bookreviews)-[^-]+-(\\d+))}")]

以下是我如何初始化RouteConfig中的翻译:

var culture = Thread.CurrentThread.CurrentUICulture;
        var specificCulture = CultureInfo.CreateSpecificCulture(culture.Name);
        var region = new RegionInfo(specificCulture.Name);

        const string en = "en";
        ISet<string> acceptedCultures = new HashSet<string>() { en, "se", "dk" };
        routes.Localization(configuration =>
        {
            configuration.DefaultCulture = en;
            configuration.AcceptedCultures = acceptedCultures;
            configuration.AttributeRouteProcessing = AttributeRouteProcessing.AddAsNeutralAndDefaultCultureRoute;
            configuration.AddCultureAsRoutePrefix = false;
            configuration.AddTranslationToSimiliarUrls = false;
        }).TranslateInitialAttributeRoutes().Translate(localization =>
        {
            localization.AddRoutesTranslation(region.TwoLetterISORegionName.ToLower());
        });

        CultureSensitiveHttpModule.GetCultureFromHttpContextDelegate = Localization.DetectCultureFromBrowserUserLanguages(acceptedCultures, en);

以下是有问题的翻译:

localization.ForCulture(culture)
            .ForController<UserController>()
            .ForAction(x => x.UserReviews(), new[] { typeof(string) })
            .AddTranslation(ConfigurationHelper.AppSetting<string>("Route.User.UserReviews"));

使用来自web.config的值:

~/{slug:regex((boganmeldelser)-[^-]+-(\\d+))}

但是我在这行上遇到编译器错误: ForAction(x => x.UserReviews(), new[] { typeof(string) }),x.UserReviews需要正式参数&#39; slug&#39;。这是有道理的。

你是如何做到这一点的?

1 个答案:

答案 0 :(得分:0)

在尝试解决同样的问题时偶然发现了这一点。

通过使用字符串值作为操作而不是linq表达式,我们设法获得了以下替代方法。字符串是操作方法名称,而不是带注释的路由名称。

   localization.ForCulture("en")
                .ForController<TestController>()
            .ForAction("TestMethod", new[] { typeof(int) })
             .AddTranslation("TranslatedTest/TranslatedTestMethod/{id}");