根据选择的语言更改控制器和动作名称

Posted

技术标签:

【中文标题】根据选择的语言更改控制器和动作名称【英文标题】:Change Controller and Action name according to language selected 【发布时间】:2016-04-22 12:03:05 【问题描述】:

我有一个控制器,名称为“Hem”,动作名称为“Om”。 我设置了瑞典语的默认语言。 所以路线将在瑞典网站上,它是

/sv/Hem/Om

现在我想通过单击语言部分的英语将语言更改为“en”。 所以路由会像这样自动设置:

/en/Home/About

但功能应该是/sv/Hem/Om 的工作,地址栏中应该显示为/en/Home/About

请各位高手帮帮我。

【问题讨论】:

【参考方案1】:

你可以这样做。

routes.MapRoute(
    "English route",
    "en/controller/action/id"
    new  controller = "Home", action = "Index", language = "en" ,
);

routes.MapRoute(
    "FrenchHome",
    "/sv/Hem/Om",
    new  controller = "Home", action = "Index", language = "fr" 
);

或者你可以这样做:

public class GenericRoutes

    public string Controller get;set;
    public string Action get;set;
    public string Urlget;set;
    public string RouteNameget;set;


public List<GenericRoutes> Routes = new List<GenericRoutes>();

Routes.Add(new GenericRoutesCotroller="bl",Action="cl",Url="bl/cl")

for(int i=0;i<Routes.count();i++) 

    routes.MapRoute(
        Routes[i].RouteName,
        Routes[i].Url,
        new  controller = Routes[i].Controller, action = Routes[i].Action ,
    );

【讨论】:

你的意思是说每一个动作我需要正确两次时间。一个用于英语“en”,另一个用于瑞典语“sv”。 ?你能不能给我一个有效和高效的方法。 已更新。我已经这样做了。我不会知道比这更好的方法。 是的,看起来我可以在没有有效方法的情况下实现我的目标。但是如果你能找到另一个完美的方法,让我给更新。谢谢。(opps我不能放弃upmark) 如果你得到你的答案然后点击右键:)。该方式在 asp.net mvc5 中不可用,但如果您使用 mvc6 则可以查看此博客strathweb.com/2015/11/localized-routes-with-asp-net-5-and-mvc-6 “我不能放弃upmark”这是什么意思?【参考方案2】:

首先,我不是专家。但是为了将用户路由到不同的控制器,您可以实现自定义路由并动态配置路由。

要了解路由的工作原理,您可以考虑检查this link。

这是一个快速的技巧:

这里是RegisterRoutes 方法,它为应用程序注册所有路由

public static void RegisterRoutes(RouteCollection routes)

    现在从 url 获取当前语言(获取 url 的第一段(在您的情况下为 en))

    查询您的数据源以获取当前语言

    从数据库或使用 foreach 的任何其他来源在此处添加您的路线。

.

foreach (var route in RouteValues)

    route.UniqueName,
    routes.MapRoute("prefix/controller/action/id, 
       new  controller = route.Controller , action = route.Action , id = route.Id  );

【讨论】:

请您详细说明一下..? 为延迟响应道歉,请参阅更新的答案。【参考方案3】:

我个人会避免这种方法用于多语言网站。是的,在技术上可以按照您的要求进行操作,但大多数网站不会以这种方式处理多种语言。 ASP.net 长期以来一直能够本地化页面,我会推荐这种方法。

本地化涉及将资源键放入视图模板中,而不是对字符串进行硬编码。然后,您将设置线程的文化,通常通过 http 接受语言标头,站点将为该文化选择适当的字符串以放入页面视图。您唯一需要维护的是每种语言的字符串集。

这种方法的好处是您只需编写一次视图。当您拥有 2 组甚至 3 组视图时,您就有可能使您的网站的这些版本出现分歧。我个人已经看到这种情况发生,这是一个很难解决的问题。此外,您还可以将您的“语言问题”与您的网站正在解决的任何问题区分开来,这意味着您的域不会被样板代码弄乱,以维持一种花哨的语言切换技术,而不是使用平台附带的解决方案。

如果您有兴趣以正确的方式在 .net 中创建多语言网站,我建议您学习本地化和全球化,这是一个很好的起点:)

Beginners Tutorial

Scott Hanselman tutorial - MVC 3 + Jquery version

【讨论】:

如果你举一个在路由中应用资源的例子会很有帮助。实际上我没有找到任何很好的解决方案来申请路线。 如果 OP 尚未将国际化整合到他的网站中,我会感到非常惊讶。尝试对 url 做同样的事情并没有错,特别是如果它可以有效地完成,即使 大多数 网站不这样做。

以上是关于根据选择的语言更改控制器和动作名称的主要内容,如果未能解决你的问题,请参考以下文章

根据操作名称授权用户

有没有办法让语言独立的控制器/视图/动作

怎么更改电脑日期格式

thinkphp笔记二

使用Route属性在Controller方法中获取控制器和动作名称

根据选择的选项卡更改导航栏的标题?