2014-10-29 61 views
4

我的ASP.NET MVC5应用程序存在问题。我的应用程序可以设置在浏览器中设置的lang/culture(现在只有英文和波兰文(默认))。我想通过点击Html.ActionLink让用户改变语言/文化。ASP.NET MVC5通过单击Html.ActionLink更改语言/文化

我创建了一个类:

namespace Guestbook 
{ 
    public static class Click 
    { 
     public static void SetCulture(string name) 
     { 
      Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(name); 
      Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture; 
     } 

    } 
} 

而且我有我的观点:

@Html.ActionLink("PL", "", "Guests", routeValues: null, htmlAttributes: new { onclick = "SetCulture(\"pl\");" }) 
@Html.ActionLink("EN", "", "Guests", routeValues: null, htmlAttributes: new { onclick = "SetCulture(\"en\");" }) 

。当然,这是行不通的。我需要更多什么? JavaScript函数?

回答

7

最简单的答案是您需要创建一个控制器,然后链接到该控制器。

public class LanguageController : Controller 
{ 
    public ActionResult SetLanguage(string name) 
    { 
     Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(name); 
     Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture; 

     HttpContext.Current.Session["culture"] = name; 

     return RedirectToAction("Index", "Home"); 
    } 
} 

然后在您的视图:

<a href="@Url.Action("SetLanguage", "Language", new { @name = "pl" })">Polski</a> 
<a href="@Url.Action("SetLanguage", "Language", new { @name = "en" })">English</a> 

你可能会考虑在会议或类似的存储用户数据。

编辑:

例如,你可以使用在Global.asax中的Application_BeginRequest事件。

protected void Application_BeginRequest(Object sender, EventArgs e) 
{ 
    var name = HttpContext.Current.Session["culture"] as string; 

    if (string.IsNullOrEmpty(name)) 
    { 
     return; 
    } 

    System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(name); 
    System.Threading.Thread.CurrentThread.CurrentUICulture = System.Threading.Thread.CurrentThread.CurrentCulture; 
} 

编辑:

保存的Cookie在SetLanguage行动:

var cookie = new HttpCookie("_culture", name); 
cookie.Expires = DateTime.Today.AddYears(1); 
Response.SetCookie(cookie); 

抓取的cookie中的Application_BeginRequest:

var cookie = HttpContext.Current.Request.Cookies["_culture"]; 
var name = cookie != null ? cookie.Value : null; 
+0

可以提供多一些存储每个用户的文化信息? – dariogriffo 2014-10-29 11:29:46

+0

正如你所说,我创建了一个控制器并编辑我的视图,但它在我的应用程序中不起作用。 – Zashi 2014-10-29 12:26:31

+0

请您详细说明一下吗?什么似乎是这个问题?行动是否受到打击? – Olivier 2014-10-29 12:33:10

1

我创建了一个小型控制器和编辑我查看。 @Olivier(感谢队友!)向我展示了如何做到这一点,但它没有奏效,因为我的应用程序将文化存储在cookie中,而不是存储在会话中。

控制器:

public class LanguageController : BaseController 
    { 
     // GET: Language 
     public ActionResult SetLanguage(string name) 
     { 
      Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(name); 
      Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture; 

      HttpCookie cultureCookie = new HttpCookie("_culture"); 
      cultureCookie.Value = name; 
      cultureCookie.Expires = DateTime.UtcNow.AddYears(1); 

      Response.Cookies.Remove("_culture"); 
      Response.SetCookie(cultureCookie); 


      return RedirectToAction("Index", "Guests"); 
     } 
    } 

LanguageController从BaseController(从控制器继承)继承,因为我用这个教程:ASP.NET MVC 5 Internationalization by Nadeem Afana

在我看来:

<a href="@Url.Action("SetLanguage", "Language", new { @name = "pl" })">Polski</a> 
<a href="@Url.Action("SetLanguage", "Language", new { @name = "en" })">English</a>