2010-11-28 30 views
1

cette erreur me rend fou. Im construire un site Web avec la possibilité de changer entre plusieurs langues..NET: NullReferenceException lors de l'application Culture Infos

Heres la (très) structure de base du site:
Default.aspx (avec CodeBehind-File)
Shared/default.master (avec CodeBehinde-File)
App_Code/BasePage.cs
App_LocalResources/Default.aspx.en.resx

Default.aspx utilise la page maître.
BasePage.cs: Les dérivés de la classe BasePage de System.Web.Ui.Page (public class BasePage Page)
Default.aspx.cs: défaut de BasePage dérivés (classe partielle du public par défaut: BasePage)

Tous ça fonctionne bien.

Puis j'ai essayé de remplacer la méthode InitializeCulture() pour permettre de changer la langue du site. La culture devrait être sous forme de deux lettres (donc "en" pas "en-US" etc.).

Voici comment le fichier BasePage.css ressemble:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Configuration; 
using System.Web.UI; 
using System.Threading; 
using System.Globalization; 

namespace Web 
{ 
public class BasePage : Page 
{ 
    protected override void InitializeCulture() 
    { 
     LanguageQS = Request.QueryString["l"].ToString(); 

     // Language 
     if(!String.IsNullOrEmpty(LanguageQS)) 
     { 
      // Validate the QueryString Value 
      string[] LanguagesArray = ConfigurationManager.AppSettings["Languages"].ToString().Split(','); 
      if(LanguagesArray.Contains(LanguageQS)) 
      { 
       Session["Language"] = LanguageQS; 
       cultureString = LanguageQS; 
      } 
     } 
     else if(Session.IsNewSession || String.IsNullOrEmpty(Session["Language"].ToString())) 
     { 
      // New Session, set default Language 
      cultureString = ConfigurationManager.AppSettings["DefaultLanguage"].ToString(); 
     } 
     else 
     { 
      // Get language from session 
      cultureString = Session["Language"].ToString(); 
     } 

     // Set the language 
     try 
     { 

      Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureString); 
      Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureString); 
     } 
     catch { throw; } 

     base.InitializeCulture(); 
    } 

    private string _culture; 
    public string cultureString 
    { 
     set { this._culture = value; } 
     get { return this._culture; } 
    } 

    private string _languageQS; 
    public string LanguageQS 
    { 
     set { this._languageQS = value; } 
     get { return this._languageQS; } 
    } 
} 

}

Maintenant, j'obtiens l'erreur suivante quand j'ouvre la page:

Line 1: <%@ Page Language="C#" MasterPageFile="~/Shared/Default.Master" Inherits="Default" meta:resourcekey="PageResource" Codebehind="Default.aspx.cs" AutoEventWireup="True" %> 

System.NullReferenceException: Object reference not set to an instance of an object. 

Je traçais l'erreur jusqu'à ces deux lignes:

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

Si je les supprime, tout fonctionne correctement.
Mais même si je mets

cultureString = "en"; 

ou

cultureString = "en-US"; 

juste en face de ces lignes que je reçois NullException.

Quelqu'un at-il un indice?

Im assez nouveau à. NET-Développement et ne peux pas trouver ce qui cause cette erreur.

+2

Vous devez utiliser le débogueur et vérifier quand l'erreur se produit, sans utiliser de débogueur, vous serez limité à beaucoup de deviner et de tester. – tenfour

Répondre

1

Merci à tous.

Mea maxima culpa pour ne pas avoir vérifié le débogueur avant de l'envoyer ici. :(

Debugger m'a dit que

LanguageQS = Request.QueryString["l"].ToString(); 

a échoué, car aucun QuerySting a été donné et ToString() ne peut pas convertir null à une chaîne.

fixe.

Merci pour l'astuce

0

pour moi sous le code fonctionne

private string _culture; 
    public string cultureString { 
     set { this._culture = value; } 
     get { return this._culture; } 
    } 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     cultureString = "en"; 
     Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureString); 
     Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureString); 
    } 

seule possibilité pour le code ci-dessus pour échouer si cultureString est réglé sur null; alors s'il vous plaît vérifier que le scénario

0

également placé la session [ "langugage"] ici:

// New Session, set default Language 
     cultureString = ConfigurationManager.AppSettings["DefaultLanguage"].ToString(); 

Session["Language"] = cultureString


Parce que dans la finale d'autre que vous l'utilisez :)

0

Dans votre code il existe des chemins où cultureString n'a pas de valeur, par exemple où LanguageQS est introuvable dans LanguagesArray.

Vérifiez également que Session["Language"] n'est pas nul avant de l'affecter à cultureString.