.Net Core 多语言路由

7
我想要做一个带有路由的“简单”的多语言Web应用程序。
我想在URL中实现以下内容: en/productsit/prodotti 使用相同的操作。
我已经创建了两个不同的路由,但它们具有相同的操作/控制器。
routes.MapRoute(
    name: "english",
    template: "en/products",
    defaults: new { controller = "home", action = "products" }
);
routes.MapRoute(
    name: "italiano",
    template: "it/prodotti",
    defaults: new { controller = "home", action = "products" }
);

当我想调用这些路由之一时,我使用:

<a href="@Url.RouteUrl("english", new { Action = "home", Controller = "products"})">Products</a>
<a href="@Url.RouteUrl("italiano", new { Action = "home", Controller = "products"})">Prodotti</a>

我获得了网址en/productsit/prodotti

问题是,当我想进行表单提交时,我无法控制返回哪个网址。

<form asp-action="products" method="post">

这只返回我的路由的第一个值。

问题是,当我像使用Url.RouteUrl链接一样发送表单时,如何控制我的路由?

我尝试了这个,但也不起作用:

[Route("it/prodotti")]
[Route("en/products")]
public ViewResutl products() {
    ...
    return View(new viewmodel...);
}
3个回答

3

好消息,终于我找到了答案。

    @using (Html.BeginRouteForm("routenamehere"))
    {
    <form>
    ...
    ...
    </form>
    }

1

我知道现在已经晚了5年,但是我相信通过动态路由现在可以实现。

app.UseEndpoints(endpoints => {
        endpoints.MapDynamicControllerRoute<TranslationTransformer>("{language}/{controller}/{action}");
    });

然后您的转换器会替换控制器和操作名称:
public TranslationTransformer(TranslationDatabase translationDatabase)
{
    _translationDatabase = translationDatabase;
}

public override async ValueTask<RouteValueDictionary> TransformAsync(HttpContext httpContext, RouteValueDictionary values)
{
    if (!values.ContainsKey("language") || !values.ContainsKey("controller") || !values.ContainsKey("action")) {
        return values;
    }

    var language = (string)values["language"];
    var controller = await _translationDatabase.Resolve(language, (string)values["controller"]);
    if (controller == null) {
        return values;
    }
    values["controller"] = controller;

    var action = await _translationDatabase.Resolve(language, (string)values["action"]);
    if (action == null) {
        return values;
    }
    values["action"] = action;

    return values;
}

翻译数据库可以是一个静态字典,只是将英文名称映射到任何其他语言。这样,您不仅限于英语和意大利语,甚至可以在运行时更改行为。

上面的代码来自于此帖子中提出的解决方案: https://medium.com/@fedonman/dynamic-controller-routing-in-asp-net-5-ac81a6bb8a95


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接