2010-11-28 2 views
1

эта ошибка приводит меня в бешенство. Im создает веб-сайт с возможностью изменения между несколькими языками.. NET: исключение NullReference при применении информации о культуре

Heres (очень) базовая структура сайта:
Default.aspx (с CodeBehind-File)
Общие/Default.Master (с CodeBehinde-File)
App_Code/BasePage.cs
App_LocalResources/Default.aspx.en.resx

Default.aspx использует Masterpage.
BasePage.cs: Класс BasePage дериваты от System.Web.UI.Page (класс BasePage общественности: Page)
Default.aspx.cs: По умолчанию дериваты от BasePage (общественный частичный класс по умолчанию: BasePage)

Все это хорошо работает.

Затем я попытался переопределить метод InitializeCulture(), чтобы можно было изменить язык сайта. Культура должна быть в двухбуквенном виде (так что «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. 

I прослежен ошибка до этих двух строк:

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

Если я удалю их, все будет хорошо работать.
Но даже если я ставлю

cultureString = "en"; 

или

cultureString = "en-US"; 

прямо перед этими линиями я понимаю, что NullException.

Кто-нибудь получил подсказку?

Я очень новичок в .NET-разработке и не могу найти причину этой ошибки.

+2

вам нужно использовать отладчик и посмотреть, когда произойдет ошибка. Без использования отладчика вы будете ограничены множеством угадываний и испытаний. – tenfour 2010-11-28 11:48:57

ответ

1

Спасибо всем.

Mea maxima culpa не проверяет отладчик перед публикацией здесь. :(

Debugger сказал мне, что

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

потерпел неудачу, потому что QuerySting не была дана, и ToString() не может преобразовать нуль в строку.

Исправлен.

Спасибо за подсказку на пути возврата. Исправлено это также.

0

для меня ниже код работает

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

только возможность выше код на провал, если cultureString установлен в нуль; поэтому, пожалуйста, убедитесь, что сценарий

0

Также установите Session [ "Langugage"] здесь:

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

Session["Language"] = cultureString


Потому что в финале еще вы используете его :)

0

В вашей код есть пути, где cultureString не присвоено значение, например где LanguageQS не найден в LanguagesArray.

Также убедитесь, что Session["Language"] не имеет значения null, прежде чем назначать его cultureString.

Смежные вопросы