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”。视图状态存储器