这个错误让我疯了。 我正在建立一个网站,可以选择在多种语言之间进行更改。
这是网站的(非常)基本结构:
Default.aspx(带CodeBehind-File)
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的新手,无法找到导致此错误的内容。
答案 0 :(得分:1)
谢谢大家。
Mea maxima culpa在发布此处之前未检查调试器。 :(
调试器告诉我
LanguageQS = Request.QueryString["l"].ToString();
失败,因为没有给出QuerySting而且ToString()无法将null转换为字符串。
修正了。
感谢返回路径上的提示。修正了这一点。
答案 1 :(得分: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设置为null,则只有上述代码失败的可能性;所以请检查那个场景
答案 2 :(得分:0)
此处还设置了Session [“Langugage”]:
// New Session, set default Language
cultureString = ConfigurationManager.AppSettings["DefaultLanguage"].ToString();
Session["Language"] = cultureString
因为在最后的其他地方你正在使用它:)
答案 3 :(得分:0)
在您的代码中,有一些路径cultureString
未分配值,例如在LanguageQS
中找不到LanguagesArray
。
在将Session["Language"]
分配给cultureString
之前,请确保{{1}}不为空。