.NET:应用区域性信息时出现NullReferenceException

bis0qfac  于 2023-05-01  发布在  .NET
关注(0)|答案(4)|浏览(114)

这个错误快把我逼疯了。即时通讯建设一个网站的选择,以多种语言之间的变化。
以下是该网站的(非常)基本结构:
Default.aspx(带CodeBehind-File)
共享/默认。Master(带CodeBehinde-File)
App_Code/BasePage.cs
App_LocalResources/Default。aspx.en.resx
Default.aspx使用母版页。
BasePage.cs:BasePage类派生自System。Web.Ui.Page(公共类BasePage:页码)
Default.aspx.cs:默认派生自BasePage(公共分部类Default: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开发,无法找到导致此错误的原因。

lvmkulzt

lvmkulzt1#

谢谢大家。
我最大的过失是在这里发布之前没有检查调试器。:(
调试器告诉我

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

失败,因为没有给出QuerySting并且ToString()无法将null转换为字符串。
修好了
谢谢你的提示返回路径。也修好了。

qmelpv7a

qmelpv7a2#

下面的代码工作

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,则上述代码仅可能失败;所以请检查场景

ajsxfq5m

ajsxfq5m3#

同时在此处设置会话[“Langugage”]:

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

Session["Language"] = cultureString
因为在最后的else中你正在使用它:)

hgb9j2n6

hgb9j2n64#

在你的代码中,有一些路径没有为cultureString赋值e。例如,在LanguagesArray中没有找到LanguageQS
在将Session["Language"]分配给cultureString之前,还要确保Session["Language"]不为空。

相关问题