2009-08-20 8 views
0

Je souhaite changer la langue de mon site Web. Je pensais que je pouvais le faire en utilisant un Handler, de sorte que le menu déroulant serait http://domain.com/Handler.ashx?language=en-US, f.i.Modification de Thread.CurrentThread.CurrentCulture sur un gestionnaire ASHX

Ainsi, il appelle le gestionnaire, qui a ce code:

string selectedLanguage = context.Request.QueryString["language"]; 

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

    context.Response.ContentType = "text/plain"; 
    context.Response.Write("Hello World"); 

    context.Response.Redirect(context.Request.UrlReferrer.AbsoluteUri.ToString()); 

Mais quand il remonte, Thread.CurrentThread.CurrentCulture est réglé sur pt-BR, qui était la valeur initiale.

Ma question est: le thread sur le gestionnaire est différent de la page aspx qui charge le contenu? Et que suggérez-vous comme un travail autour?

Merci

Répondre

1

Response.Redirect() envoie une redirection HTTP au navigateur de l'utilisateur, le navigateur fait alors une autre requête au serveur. Cela entraîne IIS gérer une demande entièrement nouvelle et, par conséquent, un nouveau thread est créé pour gérer cette demande.

Bien que je ne recommanderais pas un gestionnaire pour accomplir cela, si vous passez à Server.Transfer, votre idée PEUT fonctionner, comme Server.Transfer n'utilise pas de redirections Http mais crée simplement une nouvelle demande à envoyer à travers ASP.NET pipeline, le tout dans le contexte de la même demande initiale.

Espérons que ça aide,

+0

Merci. Ça a marché comme je le voulais. Juste par curiosité: que recommanderiez-vous dans ce cas? ty again –

+0

Eh bien, les informations de localisation et de culture devraient être quelque chose que vous essayez de gérer au niveau d'une session. L'utilisation de cette approche de gestionnaire résout le problème pour toutes les demandes qui s'exécutent via ce gestionnaire, mais cela entraîne une contrainte et une confusion inutiles dans votre code. En implémentant un contrôle serveur très simple ou similaire à placer sur vos pages (ou dans votre page maître), OnInit définit la culture des threads à une certaine valeur stockée en session, et vous modifiez cette valeur lorsque l'utilisateur sélectionne un élément dans le menu déroulant. , vous avez résolu le problème pour toute la session. Je ne peux pas comprendre ... – LorenVS

+0

Okay. Cette solution fonctionne. Mais chaque fois que je clique sur un lien, cela «redémarre» simplement la culture, je suppose que c'est pour la même raison que vous avez indiqué sur la réponse originale. Je vais pour la tentative au niveau de la session. –

Questions connexes