2010-11-28 15 views
1

このエラーは私にナットをもたらしています。 複数の言語に変更するオプションのあるウェブサイトを構築する。.NET:Culture Infosを適用するとNullReferenceExceptionが発生する

相続人は、サイトの(非常に)基本構造:(分離コード-ファイル付き)
Default.aspxを(CodeBehinde-ファイル付き)
共有/ Default.Master
にApp_Code/BasePage.cs
App_LocalResources/Default.aspx.en.resx

Default.aspxは、マスターページを使用します。
BasePage.cs:System.Web.Ui.PageからBasePageクラスクラス誘導体(パブリッククラスBasePageクラス:ページ)
Default.aspx.cs:BasePageクラスからデフォルト誘導体(パブリック部分クラスのデフォルト:BasePageクラス)

すべてそれはうまくいく。

次に、InitializeCulture()メソッドをオーバーライドして、サイトの言語を変更できるようにしました。 文化は2文字の形式にする必要があります( "en"は "en-US"などではありません)。

これはBasePage.cssファイルがどのように見えるかです:私は、ページを開いたときに

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; } 
    } 
} 

}

今、私は次のエラーを取得する:

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. 

私がトレース次の2行のエラー:

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

私がそれらを取り除くと、すべてうまく機能します。
しかし、私は右の私がNullExceptionことを得るそれらの行の前に

cultureString = "en"; 

または

cultureString = "en-US"; 

を入れていても。

誰かがヒントを得ましたか?

このエラーを引き起こすものは、.NET開発とカントではかなり新しいです。コードの下に私のために

+2

デバッガを使用せずに、多くの推測とテストに限定されます。 – tenfour

答えて

1

ありがとうございます。

ここに投稿する前にデバッガをチェックしないためのMea Maxima Culpa。 :(

デバッガは

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

は何QueryStingが与えられなかったため、失敗したとのToString()文字列にnullを変換傾けることを教えてくれました。

はそれを修正しました。ヒントの

感謝を

0

はcultureStringがnullに設定されている場合、上記のコードは失敗する唯一の可能性

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); 
    } 

動作します。そのため、シナリオを確認してください

0

もここでセッション[ "Langugageを"]に設定しますので、あなたはそれを使用している:)

0

をお使いでは他の決勝で

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

Session["Language"] = cultureString


をコードには、cultureStringに値が割り当てられていないパスがあります。 LanguagesArrayにはLanguageQSが見つかりません。

cultureStringに割り当てる前にSession["Language"]がヌルでないことも確認してください。

関連する問題