【问题标题】: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

请各位高手帮帮我。

【问题讨论】:

    标签: c# asp.net-mvc model-view-controller razor asp.net-routing


    【解决方案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 Url{get;set;}
        public string RouteName{get;set;}
    }
    
    public List<GenericRoutes> Routes = new List<GenericRoutes>();
    
    Routes.Add(new GenericRoutes{Cotroller="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)
    {}
    
    1. 现在从 url 获取当前语言(获取 url 的第一段(在您的情况下为 en))

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

    3. 从数据库或使用 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 做同样的事情并没有错,特别是如果它可以有效地完成,即使 大多数 网站不这样做。
    猜你喜欢
    • 1970-01-01
    • 2017-08-29
    • 2021-08-25
    • 2010-10-18
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多