如何在asp.net mvc的url中的{controller}位置之前添加诸如“en-gb”之类的文化字符串?

时间:2012-05-02 15:33:42

标签: asp.net-mvc multilingual currentculture

基本上我想通过以下方案实现多语言网站:

  • 使用ASP.NET MVC 3
  • 大多数语言都在使用资源文件,因此他们使用相同的视图,但也有许多视图是特定于国家/地区的(即语言文化特定的)并且并非所有人都可以使用。
  • 示例网址:http:// localhost / zh-CN / {area} / {controller} / {action} / {id}

MVC文件夹结构如下:

- Areas
    - Channel1
        - Controllers
        - Content
        - Views
            - en-us
                - View1.cshtml
                - View2.cshtml
            - zh-cn
                - View1.cshtml
                - View2.cshtml
                <b>- Special.cshtml</b>

    - Channel2
       ....(similar folder structure)
- ....

我认为必须有一种方法可以将“en-us”定义为像{lang}这样的参数,并在区域外的默认控制器中做出决定 - 但是我是asp.net MVC的新手,我该怎么办?是什么?

3 个答案:

答案 0 :(得分:0)

这是一篇很棒的文章,提供了有关如何在ASP.NET MVC 3上实现全球化的实用建议

http://www.hanselman.com/blog/GlobalizationInternationalizationAndLocalizationInASPNETMVC3JavaScriptAndJQueryPart1.aspx

答案 1 :(得分:0)

没有很好的方法可以做到这一点,但这是可能的。首先,你需要重新安排你的观点 - 他们仍然需要一个控制器。假设您拥有的文件(View1.cshtmlView2.cshtml)存在于您的家庭控制器中。把它们放在这里:

- Views
  - Home
    - en-us
      - View1.cshtml
      - View2.cshtml
    - zh-cn
      - View1.cshtml
      - View2.cshtml

然后,为Global.asax.cs中的视图创建自定义路线:

routes.MapRoute(
    "MultiLingual",
    "{lang}/{controller}/{action}/{id}",
    new {  controller = "Home", action = "Index", lang="en-us", id = UrlParameter.Optional }
);

最后,在您的家庭控制器(或任何想要放入视图的控制器)中,使用lang参数确定要使用的视图:

public ActionResult View1( string lang, int? id ) {
    return View( lang + "/View1" );
}

public ActionResult View2( string lang, int? id ) {
    return View( lang + "/View2" );
}

我试过这个并且它有效,但它感觉非常笨重,而且不是很干(至少在动作中)。任何人都有更好的方法吗?

答案 2 :(得分:0)

您可以随时编写自己的视图引擎,根据内容查看文件夹。ThemedViewengine that does just that有代码。