MasterPage对象返回null

时间:2014-04-02 14:46:28

标签: c# asp.net code-behind

我有一个ASP.net应用程序,用于显示从我们的ERP系统查询到各种网页的信息。主要对象称为EpicorUser,它基本上封装了有关员工的所有当前信息。

此对象用于填写母版页上的一系列各种字段,如全名,当前活动,时钟输入/输出时间等。

我正在尝试将此对象从MasterPage传递到内容页面,以避免不必要地查询提供此信息的WebService。问题是,当我从ContentPage访问对象时,它始终为null。我知道它已被填充,因为我的MasterPage内容全部填写正确。

我正试图从我的ContentPage访问MasterPage的“CurrentUser”对象,如下所示:

**MasterPage Codebehind:**
public EpicorUser CurrentUser; //This object is populated once user has authenticated

///This is in my ContentPage ASPX file so I  can reference the MasterPage from codebehind
<%@ MasterType VirtualPath="~/Pages/MasterPage/ShopConnect.Master" %>

**ContentPage CodeBehind:**
string FullName = Master.CurrentUser.UserFileData.FullName; //CurrentUser is null(but it shouldn't be)

奇怪的是,我有另一个内容页面,这个系统工作正常。它也停止了工作,我认为我没有改变主页上可能导致这种情况的任何内容。我已将CurrentUser设置为公共属性,因此我可以访问

我到目前为止创建了一个从主页重新填充对象的方法,并从内容页面上的代码隐藏中调用它:

**ContentPage code-behind:**
EpicorUser CurrentUser = Master.GetCurrentUserObject();

**MasterPage Method being invoked:**
public EpicorUser GetCurrentUserObject()
{
    using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "OFFICE"))
    {
        UserPrincipal principal = UserPrincipal.FindByIdentity(context, HttpContext.Current.User.Identity.Name);
        EpicorUser CurrentEmployee = RetrieveUserInfoByWindowsID(principal.SamAccountName);   
        return CurrentUser; //Object is NOT null before the return
    }
}

**ContentPage code-behind return:**
EpicorUser CurrentUser = Master.GetCurrentUserObject(); //But object is now null once we return  

单步执行代码向我显示CurrentUser对象在后面的MasterPage代码中正确填充,但是一旦返回到后面的C​​ontentPage代码,它现在为空!

任何人都知道断开连接的位置?

1 个答案:

答案 0 :(得分:2)

首先加载内容页面,然后加载主页面。因此,在内容页面中访问您的属性时,您的属性可能为空。您可以尝试在母版页上创建公共方法(以返回UserObject),然后从内容页面调用该方法。

另一种选择是 创建基页类(继承所有内容页面)并创建一个属性以返回用户对象。因此,所有页面都可以访问值

编辑:

public class BasePageClass : System.Web.UI.Page
{
    public List<string> LookupValues
    {
        get
        {
            if (ViewState["LookupValues"] == null)
            {
                /*
                    * create default instance here or retrieve values from Database for one time purpose
                    */
                ViewState["LookupValues"] = new List<string>();
            }
            return ViewState["LookupValues"] as List<string>;
        }
    }
}
public partial class WebForm6 : BasePageClass
{
    protected void Page_Load(object sender, EventArgs e)
    {           
    }
    protected void MyButton_Click(object sender, EventArgs e)
    {
        //access lookup properties
        List<string> myValues = LookupValues;
    }
}