我一直致力于本地化,并希望将语言放入 Viewstate 以在用户控件中访问。
我设置了一个测试项目来显示问题。在用户控件上,我只有一个标签。
如果我不访问母版页视图状态(该行被注释掉),一切正常并创建标签。
如果我访问视图状态以从视图状态获取语言,则会收到未找到对象错误,并且该对象将为空。错误是:
你调用的对象是空的。
变量“culture”确实从 Viewstate 中获取字符串。
如果我用母版页访问注释掉该行,则设置“文化”并且一切正常。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Globalization;
namespace TestCulture
{
public partial class Sample : System.Web.UI.Page
{
protected override void InitializeCulture()
{
string culture;
culture = "en-US";
culture = "es-MX";
culture = ((TestCulture.Site1)Page.Master).zCulture;
base.InitializeCulture();
System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo(culture);
}
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Page_PreRender(object sender, EventArgs e)
{
lblTestLabel.Text = ((TestCulture.Site1)Page.Master).Name;
}
}
}
母版页是:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace TestCulture
{
public partial class Site1 : System.Web.UI.MasterPage
{
public string zCulture
{
get
{
if (ViewState["ocCulture"] == null)
ViewState["ocCulture"] = "en-US";
return (string)ViewState["ocCulture"];
}
set { ViewState["ocCulture"] = value; }
}
public string Name
{
get
{
if (ViewState["Name"] == null)
ViewState["Name"] = "Tom";
return (string)ViewState["Name"];
}
set { ViewState["ocCulture"] = value; }
}
protected void Page_Load(object sender, EventArgs e)
{
}
}
}
实际上,如果您从“InitializeCulture”访问母版页上的属性,它不会创建控件。
您可以从 Page_Load 和 Page_Init 事件中访问属性,而不会受到任何影响。
为什么访问该属性会导致无法创建控件?
谢谢,
汤姆