为什么我得到“对象引用未设置为对象的实例”。在asp.net中更改页面时

时间:2011-03-18 00:20:51

标签: c# asp.net

我有一个母版页,用于设置我想在整个网站上使用的一些变量。

protected void Page_Load(object sender, EventArgs e)
{
    //Get users name from AD
    str_DomainName = HttpContext.Current.User.Identity.Name;
    str_CurrentLogin = str_DomainName.Substring(5);

    //Display current user information
    DirectorySearcher search = new DirectorySearcher("LDAP://DCHS");
    search.Filter = String.Format("(SAMAccountName={0})", str_CurrentLogin);
    SearchResult result = search.FindOne();
    DirectoryEntry entry = result.GetDirectoryEntry();
    lbl_CurrentUser.Text = result.Properties["givenName"][0].ToString() + ' ' + result.Properties["sn"][0].ToString();

    // Get SID
    IntPtr logonToken = WindowsIdentity.GetCurrent().Token;
    WindowsIdentity windowsId = new WindowsIdentity(logonToken);

    //Set session variabls
    this.CurrentFirstName = result.Properties["givenName"][0].ToString();
    //this.CurrentEmail = result.Properties["mail"][0].ToString();
    //this.CurrentSID = windowsId.User.ToString();
    //this.CurrentUserName = str_CurrentLogin;
    //this.CurrentFullName = lbl_CurrentUser.Text;
    //this.CurrentDomain = str_DomainName;
    this.Session.Add("currentEmail", result.Properties["mail"][0].ToString());
}

public String CurrentFirstName
        {
            get { return (String)ViewState["currentFirstName"]; }
            set { ViewState["currentFirstName"] = value; }
        }

然后我在我的defalut.aspx页面中调用它们,如下所示:

protected void Page_PreRender(object sender, EventArgs e)
        {
            //try
            //{
                lbl_FullName.Text = Master.CurrentFullName;
                lbl_SID.Text = Master.CurrentSID;
                testLabel.Text = Master.CurrentEmail;
            //}
            //catch (Exception ex)
            //{ }
        }

这很好..如果我离开默认页面,那么我得到以下错误..

  

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

一条lbl_FullName.Text = Master.CurrentFullName;

如果我取消对try catch的注释,那么它可以正常工作,但我不相信这是避免错误的正确方法。

我只是ASP的新手,所以要好..

编辑:

变量在Master.cs中设置如下。

public String CurrentUserName
        {
            get { return (String)ViewState["currentUserName"]; }
            set { ViewState["currentUserName"] = value; }
        }

2 个答案:

答案 0 :(得分:1)

几个问题:

  • 表达式的哪一侧产生错误:this.lbl_FullName或this.Master?
  • 如果是前者,那么 page.aspx.designer.cs 文件中会出现一些时髦的东西。确保标签控件已在那里声明(此文件由visual studio自动生成,但有时可能无法正确更新)。您应该看到如下一行:
  

保护   全球:: System.Web.UI.WebControls.Label   lbl_FullName;

  • 如果是 this.Master 属性,那么您的网页显然不会引用您的母版页。检查页面指令(.aspx文件的第一行),并确保设置了 DynamicMasterPage 值且路径正确。

在设计说明中,母版页不是“存储变量”的最佳位置。母版页应该只是用于初始化整个网站的页面的公共部分。

如果您需要从用户收集信息并在多个页面中使用它,请使用会话变量。只要用户的浏览器处于打开状态,这就是一种在内存中存储对象的方法。

可以按如下方式将项目添加到会话中:

this.Session.Add("fullName", fullName);

以后可以从您网站中的任何其他页面/用户控件中检索项目,如下所示:

string fullName = (string)this.Session["fullName"];

答案 1 :(得分:0)

ViewState是每页。当您导航到新页面时,它未设置。

您的母版页应将这些内容放入Session