0

我正在尝试做一些类似于 microsoft 用于文档站点的事情。例如,当我在地址栏中输入下面的链接时,microsoft docs 网站将我重定向到默认的文化链接,就像第二个链接中的内容一样。

第一个链接:https ://docs.microsoft.com/aspnet/core/fundamentals/localization?view=aspnetcore-2.2 第二个链接:https ://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization ?view=aspnetcore-2.2

我一步一步地阅读这篇文章(https://joonasw.net/view/aspnet-core-localization-deep-dive),项目成功运行,我可以通过调用像这样的 url 来改变文化

localhost:5001/tr-TR/home/index ({culture}/[controller]/[action]) 

但是当我尝试路由到

localhost:5001/home/index (without culture route value)

我收到错误 404。

我需要的是将上述链接路由到一些共享控制器操作中,然后将其重定向到

localhost:5001/{defaultculture}/home/index

先感谢您。

4

2 回答 2

0

因为https://docs.microsoft.com,它使用 URL 重定向功能来实现路由https://docs.microsoft.com/aspnet/core/fundamentals/localization?view=aspnetcore-2.2https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-2.2. 如果你检查请求日志https://docs.microsoft.com/aspnet,你会发现第一个请求,它返回响应,Status Code: 301然后返回https://docs.microsoft.com/en-us/aspnet

根据您的要求,如果您只需要localhost:5001/home/index返回视图localhost:5001/en-us/home/index而不将 url 更改为localhost:5001/en-us/home/index. 你可以试试

var localizationOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>().Value;
var requestProvider = new RouteDataRequestCultureProvider();
localizationOptions.RequestCultureProviders.Insert(0, requestProvider);
app.UseRouter(routes =>
{
    routes.MapMiddlewareRoute("{culture=en-US}/{*mvcRoute}", subApp =>
    {
        subApp.UseRequestLocalization(localizationOptions);

        subApp.UseMvc(mvcRoutes =>
        {
            mvcRoutes.MapRoute(
                name: "default",
                template: "{culture=en-US}/{controller=Home}/{action=Index}/{id?}");
        });
    });

});

如果您需要与 相同的 URL localhost:5001/en-us/home/index,您还需要执行重定向操作。

app.Use(async (context, next) =>
{
    await next.Invoke();
    if (context.Response.StatusCode == StatusCodes.Status404NotFound)
    {
        context.Response.Redirect(@"/en-us/Home/Index", true);
    }
});

app.UseRouter(routes =>
{
    routes.MapMiddlewareRoute("{culture}/{*mvcRoute}", subApp =>
    {
        subApp.UseRequestLocalization(localizationOptions);

        subApp.UseMvc(mvcRoutes =>
        {
            mvcRoutes.MapRoute(
                name: "default",
                template: "{culture}/{controller=Home}/{action=Index}/{id?}");
        });
    });

});
于 2018-12-13T06:29:08.960 回答
0

你需要改变你的路线。在下面的示例中,当用户输入时localhost:5001/home/index将被重定向到控制器中的RedirectToCulture操作。Home现在您可以读取(或不读取)参数并使用默认文化重定向

routes.MapRoute(
    name: "default1",
    template: "{culture:required}/{controller:required}/{action:required}/{id?}",
    defaults: new { culture = "en-US", controller = "Home", action = "Index" });

routes.MapRoute(
    name: "default2",
    template: "{stringController?}/{stringAction?}/{id?}",
    defaults: new { controller = "Home", action = "RedirectToCulture" });
于 2018-12-12T15:28:06.750 回答