从InitializeCulture访问母版页中的属性会阻止创建控件

本文关键字:创建 控件 属性 InitializeCulture 访问 母版页 | 更新日期: 2023-09-27 18:28:49

我一直在进行本地化工作,希望将该语言放入Viewstate,以便在用户控件中访问。

我设置了一个测试项目来展示这个问题。在用户控件上,我只有一个标签。

如果我不访问母版页视图状态(该行被注释掉),那么一切都很好,标签也就创建了。

如果我访问视图状态以从视图状态获取语言,我会得到一个未找到对象的错误,该对象将为null。错误为:

对象引用未设置为对象的实例。

变量"区域性"确实从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事件访问属性而不受任何影响。

为什么访问属性会导致无法创建控件?

谢谢,

Tom

从InitializeCulture访问母版页中的属性会阻止创建控件

对象引用未设置为对象的实例。

您引用了null。您返回"en-US"或String.null.

if (ViewState["ocCulture"] == null) 
   ViewState["ocCulture"] = "en-US";
return (string)ViewState["ocCulture"];

试试这个:

if (ViewState["ocCulture"] == null)
        {
            ViewState["ocCulture"] = "en-US";
        }
        else 
       { 
          ViewState["ocCulture"] = "";
       }
return (string)ViewState["ocCulture"];