.NET: NullReferenceException при применении информации о культуре - PullRequest
1 голос
/ 28 ноября 2010

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

Вот (очень) базовая структура сайта:
Default.aspx (с CodeBehind-файлом)
Shared / Default.Master (с CodeBehinde-File)
App_Code / BasePage.cs
App_LocalResources / Default.aspx.en.resx

Default.aspx использует главную страницу.
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.

Я проследил ошибку до этих двух строк:

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

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

cultureString = "en";

или

cultureString = "en-US";

прямо перед этими строками я получаю это NullException.

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

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

Ответы [ 4 ]

1 голос
/ 30 ноября 2010

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

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

Отладчик сказал мне, что

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

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

Исправлено.

Спасибо за подсказку о путях возврата. Это тоже исправлено.

0 голосов
/ 28 ноября 2010

Также установите Сессию ["Languages"] здесь:

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

Session["Language"] = cultureString


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

0 голосов
/ 28 ноября 2010

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

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

0 голосов
/ 28 ноября 2010

для меня приведенный ниже код работает

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 задано значение NULL;поэтому, пожалуйста, проверьте этот сценарий

...