【问题标题】:Why do I get "Object reference not set to an instance of an object." when changing pages in asp.net为什么我得到“对象引用未设置为对象的实例”。在 asp.net 中更改页面时
【发布时间】:2011-07-17 20:09:03
【问题描述】:

我有一个母版页,其中设置了一些我想在整个站点中使用的变量..

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; }
        }

【问题讨论】:

  • 这可能取决于处理各种事件的顺序(即,您可能正在尝试在主页中设置值之前从页面读取值)。查看this 并尝试检查事件顺序
  • 什么是主变量?它是在其他页面上设置还是默认设置?
  • 查看我的编辑以了解我如何生成变量
  • stackoverflow.com/questions/4660142/… 的根本原因:“因为你没有初始化变量”。

标签: c# asp.net


【解决方案1】:

几个问题:

  • 表达式的哪一边产生错误:this.lbl_FullName 还是 this.Master?
  • 如果是前者,那么您的 page.aspx.designer.cs 文件中就会发生一些奇怪的事情。确保已在其中声明标签控件(此文件由 Visual Studio 自动生成,但有时无法正确更新)。您应该会看到如下一行:

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

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

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

如果您需要从用户那里收集信息并在多个页面中使用它,请使用会话变量。这是一种在用户浏览器打开时将对象存储在“内存中”的方法。

可以将项目添加到会话中,如下所示:

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

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

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

【讨论】:

  • 如何判断错误来自哪一侧?另外,您是否建议我将所有用户抓取代码转移到默认页面?
  • 另外,你建议我把你提到的代码放在哪里?在 Default.aspx.cs?
  • 不过,从查看您的代码来看,我只需将您的母版页中的“ViewState”一词替换为“Session”即可。 ViewState 内存特定于单个页面(即,当用户导航到您网站的不同页面时,它会丢失/清除),而只要您的网站在浏览器中打开,会话内存就会持续存在。此外,如果您将变量存储在会话中,那么您只需要获取并存储它们一次——如果您使用 ViewState,则必须在每个页面上再次获取并存储它们。
  • 作为脚注,要准确查看导致代码错误的原因,只需在页面顶部(或您要查询的任何行)放置一个断点,然后在 Visual Studio 中按 F5 .这允许您一次单步执行并执行您的页面——这称为调试。你会做很多!
【解决方案2】:

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

您的母版页应改为将这些放入 Session

【讨论】:

  • 但是当我尝试离开默认页面时,错误发生在默认页面上?
  • @Matt:那么,你的意思是什么?您确定错误是 on 默认页面吗?你是如何试图摆脱它的?无论如何,这无关紧要:ViewState 是页面实例的属性。你应该使用Session state。
  • 我有一个母版页,它在加载时设置 ViewState 变量.. Default.aspx 是要显示的第一个页面,PreRender 方法抓取变量并显示它们.. 这一切正常。如果我有一个导航到另一个页面的链接,例如 bob.aspx,那么当我单击该链接时,我会收到错误消息,该错误位于 Default.aspx 页面的第 23 行。第 23 行是lbl_FullName.Text = Master.CurrentFullName;
  • 哦,ViewState 是 MSDN 告诉我使用的方法
  • @Matt:MSDN 没有告诉你这个。你误会了。如果您将代码更改为以与使用“ViewState”完全相同的方式使用“Session”,那么它将起作用。
猜你喜欢
  • 1970-01-01
  • 2019-03-20
  • 2013-10-28
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
  • 2012-08-08
  • 2020-04-13
  • 2013-04-19
相关资源
最近更新 更多