Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我会得到;对象引用未设置为对象的实例。”;在asp.net中更改页面时_C#_Asp.net - Fatal编程技术网

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

C# 为什么我会得到;对象引用未设置为对象的实例。”;在asp.net中更改页面时,c#,asp.net,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 us

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

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)
            //{ }
        }
this.Session.Add("fullName", fullName);
string fullName = (string)this.Session["fullName"];
这个很好用。。但是,如果我离开默认页面,则会出现以下错误

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

一个是
lbl\u FullName.Text=Master.CurrentFullName

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

我是ASP的新手,所以要友善

编辑:

变量在Master.cs中设置如下

public String CurrentUserName
        {
            get { return (String)ViewState["currentUserName"]; }
            set { ViewState["currentUserName"] = value; }
        }
有几个问题:

  • 表达式的哪一侧正在生成错误:this.lbl_FullName还是this.Master
  • 如果是前者,那么在page.aspx.designer.cs文件中会出现一些奇怪的东西。确保已在其中声明label控件(此文件由visual studio自动生成,但有时无法正确更新)。您应该看到这样一行:
保护 全局::System.Web.UI.WebControls.Label lbl_全名

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

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

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

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

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)
            //{ }
        }
this.Session.Add("fullName", fullName);
string fullName = (string)this.Session["fullName"];
随后可以从站点中的任何其他页面/用户控件检索项目,如下所示:

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)
            //{ }
        }
this.Session.Add("fullName", fullName);
string fullName = (string)this.Session["fullName"];
有几个问题:

  • 表达式的哪一侧正在生成错误:this.lbl_FullName还是this.Master
  • 如果是前者,那么在page.aspx.designer.cs文件中会出现一些奇怪的东西。确保已在其中声明label控件(此文件由visual studio自动生成,但有时无法正确更新)。您应该看到这样一行:
保护 全局::System.Web.UI.WebControls.Label lbl_全名

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

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

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

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

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)
            //{ }
        }
this.Session.Add("fullName", fullName);
string fullName = (string)this.Session["fullName"];
随后可以从站点中的任何其他页面/用户控件检索项目,如下所示:

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)
            //{ }
        }
this.Session.Add("fullName", fullName);
string fullName = (string)this.Session["fullName"];

ViewState
为每页。当您导航到新页面时,它不会被设置


您的母版页应该将这些内容放入
会话
中。

视图状态
为每页。当您导航到新页面时,它不会被设置


您的母版页应该将这些内容放入
会话中。

这可能取决于各种事件的处理顺序(即,您可能试图在母版页中设置某个值之前从该页读取该值)。查看并尝试检查事件序列。主变量是什么?它是在其他页面上设置的还是默认设置的?有关如何生成变量的信息,请参见我的编辑查看基本原因:“因为您没有初始化变量”。这可能取决于各种事件的处理顺序(即,在母版页中设置值之前,您可能正在尝试从页面读取值)。查看并尝试检查事件序列。主变量是什么?它是在其他页面上设置的还是默认设置的?有关如何生成变量的信息,请参见我的编辑查看基本原因:“因为您没有初始化变量”。如何判断错误来自哪一方?另外,你建议我把所有的用户抓取代码转移到默认页面吗?还有,你建议我把你提到的代码放在哪里?不过,在默认的.aspx.cs中,从查看代码开始,我只需在母版页中将“ViewState”替换为“Session”。ViewState内存特定于单个页面(即,当用户导航到站点的其他页面时,它将丢失/清除),而会话内存将在浏览器中打开站点时持续使用。此外,如果在会话中存储变量,则只需获取并存储一次——如果使用ViewState,则必须在每页上再次获取并存储变量。作为脚注,要查看代码中错误的确切原因,只需在页面顶部(或要查询的任何行)放置一个断点并在VisualStudio中点击F5。这允许您一次一行地单步执行页面,这称为调试。你会做很多的!我如何判断错误来自哪一方?另外,你建议我把所有的用户抓取代码转移到默认页面吗?还有,你建议我把你提到的代码放在哪里?不过,在默认的.aspx.cs中,从查看代码开始,我只需在母版页中将“ViewState”替换为“Session”。视图状态存储器