根据所选语言更改Controller和Action名称

时间:2016-01-17 06:19:52

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

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

/sv/Hem/Om

现在我想将语言改为" en"在语言部分单击英语。 所以路线会像这样自动设定:

/en/Home/About

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

专家可以帮助我。

3 个答案:

答案 0 :(得分:8)

你可以这样做。

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 },
    );
}

答案 1 :(得分:2)

对于多语种网站,我个人会避免这种方法。是的,技术上可以做你要求的但大多数网站都不会以这种方式处理多种语言。 ASP.net已经能够长时间本地化页面,我建议采用这种方法。

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

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

如果您对使用.net中的多语言网站感兴趣,我建议您学习本地化和全球化,这是一个很好的起点:)

Beginners Tutorial

Scott Hanselman tutorial - MVC 3 + Jquery version

答案 2 :(得分:0)

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

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

这是一个快速的技巧:

这是注册所有申请路线的RegisterRoutes方法

public static void RegisterRoutes(RouteCollection routes)
{}
  1. 现在从url获取当前语言(获取url的第一段(在你的情况下为en))

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

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

  4. foreach (var route in RouteValues)
    {
        route.UniqueName,
        routes.MapRoute("prefix/{controller}/{action}/{id}, 
           new { controller = route.Controller , action = route.Action , id = route.Id  });
    }