我想使用会话将用户名从登录页面传递到母版页,但我得到“对象引用未设置为对象的实例”错误。我的登录页面代码是,
protected void btnLogin_Click(object sender, EventArgs e)
{
string connectionString = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString;
SqlConnection con = new SqlConnection(connectionString);
con.Open();
SqlCommand cmd = new SqlCommand("select * from Registration where UserName = @username and Password = @password", con);
cmd.Parameters.AddWithValue("@username", txtLogin.Text);
cmd.Parameters.AddWithValue("@password", txtPassword.Text);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
if (dt.Rows.Count > 0)
{
Session["name"] = txtLogin.Text.Trim();
Response.Redirect("ImageSearch.aspx");
}
else
{
ClientScript.RegisterStartupScript(Page.GetType(), "validation", "<script language='javascript'>alert('Invalid Username and Password')</script>");
}
}
,对于母版页代码是
protected void Page_Load(object sender, EventArgs e)
{
Label1.Visible = true;
string sessionUserName = (string)(Session["name"]);
Label1.Text = sessionUserName;
}
答案 0 :(得分:0)
根据Asp.net中的页面生命周期,Page_Load始终在事件发生之前触发。 在您的情况下,首先触发登录页面的Page_Load,主页面的Page_load,然后单击事件。这就是您的母版页中Session [“Name”]为空的原因。
如果您想在单击后立即更新母版页中的“Label1.Text”,则需要手动更新母版页。
protected void btnLogin_Click(object sender, EventArgs e)
{
string connectionString = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString;
SqlConnection con = new SqlConnection(connectionString);
con.Open();
SqlCommand cmd = new SqlCommand("select * from Registration where UserName = @username and Password = @password", con);
cmd.Parameters.AddWithValue("@username", txtLogin.Text);
cmd.Parameters.AddWithValue("@password", txtPassword.Text);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
if (dt.Rows.Count > 0)
{
Session["name"] = txtLogin.Text.Trim();
(Master as SiteMaster).UpdatePage();
Response.Redirect("ImageSearch.aspx");
}
else
{
ClientScript.RegisterStartupScript(Page.GetType(), "validation", "<script language='javascript'>alert('Invalid Username and Password')</script>");
}
}
在您的母版页中,添加一个方法:
public void UpdatePage()
{
Label1.Visible = true;
string sessionUserName = (string)(Session["name"]);
Label1.Text = sessionUserName;
}
答案 1 :(得分:0)
主页面加载事件将在按钮单击事件之前执行,因此在此方案中您将不会在主页面加载时具有会话值。
https://msdn.microsoft.com/en-us/library/dct97kc3.aspx
您可以尝试从按钮点击事件本身 -
设置母版页标签值this.Master.Label11.Text = txtLogin.Text.Trim();