2013-03-27 32 views
0

我在webforms aspx项目中构建了多语言站点,我正在考虑这样做的最佳解决方案。在ASPX项目中设置CurrentUI

我在MasterPage上有一些图像,一旦点击了,我就调用一个Jquery方法,它应该重定向到一个web方法。

反过来,我有一个基础页面正在初始化文化,并且除MasterPage外的所有页面都从它继承。

到目前为止,我有以下几点: -

HTML: -

<div class="LocalizationFlags"> 
<img src="Images/gb.png" onclick="langSelection('gb')" /> &nbsp; &nbsp; 
<img src="Images/fr.png" onclick="langSelection('fr')"/> &nbsp; &nbsp; 
<img src="Images/es.png" onclick="langSelection('es')"/> &nbsp; &nbsp; 
<img src="Images/de.png" onclick="langSelection('de')"/> &nbsp; &nbsp; 
<img src="Images/it.png" onclick="langSelection('it')"/> 
</div> 

JQuery的: -

function langSelection(lang) { 
    setSession(lang); 
}; 

function setSession(Lang) { 
    var args = { 
     lang: Lang 
    }; 
    $.ajax({ 
     type: "POST", 
     url: "Site.Master.aspx/SetUserCulture", 
     data: JSON.stringify(args), 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function() { 
      alert('Success.'); 
     }, 
     error: function() { 
      alert("Fail"); 
     } 
    }); 
}; 

Site.Master.cs

[WebMethod(EnableSession = true)] 
    private void SetUserCulture(string lang) 
    { 
     HttpContext.Current.Session["CurrentUI"] = lang; 
    } 

BasePage的。 cs

protected override void InitializeCulture() 
    { 
     if (Session["CurrentUI"] != null) 
     { 
      String selectedLanguage = (string)Session["CurrentUI"]; 
      UICulture = selectedLanguage; 
      Culture = selectedLanguage; 

      Thread.CurrentThread.CurrentCulture = 
       CultureInfo.CreateSpecificCulture(selectedLanguage); 
      Thread.CurrentThread.CurrentUICulture = new 
       CultureInfo(selectedLanguage); 
     } 

     base.InitializeCulture(); 
    } 

现在有几个问题,我现在有什么。 jquery不起作用,抛出一个“失败”,并且我知道我不能使用Site.Master.cs来放置webmethod。

这是仅仅为这种方法创建一个WCF服务的情况,而且然后从Jquery代码中调用它?

我在正确的轨道上吗?

感谢您的帮助和时间

回答

0

你的Ajax请求,因为它没有到达目的地最有可能的失败 - 就像你说的,你不能在主人的代码隐藏WebMethod。此外,不需要使用JSON序列化参数,普通对象也应该可以正常工作。此外,此处不需要dataType: json - 您不会为此请求返回任何数据。

这里不需要web服务 - 一个简单的HTTP处理程序就足够了。只要不要忘记使用标记接口IRequiresSessionState来访问处理程序中的会话。

一般而言,Cookie可能是存储用户文化的更好地方,因为您可能希望跨同一用户的不同访问保留此信息。另一个选项是DB中的用户配置文件 - 以防您处理注册用户。但是,使用会话的当前实现应该有效。

+0

嗨安德烈,感谢您的解释。你能给我一个你提到的HTTP处理程序的例子吗? – Johann 2013-03-27 14:12:53

+0

@Johann,这里是[MSDN页面](http://msdn.microsoft.com/en-us/library/system.web.ihttphandler.aspx)的链接。用两个词来说,它非常简单 - 用一种方法实现一个接口,在web.config中注册,然后从应用程序的其他部分调用它。 – Andrei 2013-03-27 14:19:43

+0

嗨安德烈,所以我创建了一个类CultureHandler实现IHTTPHandler和IRequiresSessionState,一个方法SetUserCulture(字符串郎)。你如何在web.config中注册它,然后在代码中使用它? – Johann 2013-03-27 14:39:35