在 Web 窗体项目中,我使用母版页作为用户角色,而其他页面继承自母版页。我尝试将此代码用于母版页中的加载函数:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
string MyPage = System.IO.Path.GetFileName(Request.Path);
SqlDataReader RolePageDr = BLL.Users.RolesPage(MyPage);
while (RolePageDr.Read())
{
string Rolepage = RolePageDr["Roles"].ToString();
if (Page.User.IsInRole(Rolepage) != true)
{
Response.Redirect("~/MsgPage.aspx");
}
else
Response.Redirect(MyPage);
}
}
}
但问题是,当用户重定向到其他页面(例如:AdminPage)时,此管理页面继承自MasterPage,此加载函数再次运行。
它会一次又一次地运行;这就是无状态编程的本质。 但是您可以做的是使用 session 来存储它,然后仅在会话不存在时才重新加载它,如下所示:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
string role;
var sessionValue = Session["Roles"];
if (sessionValue != null)
role = sessionValue.ToString();
else
{
string MyPage = System.IO.Path.GetFileName(Request.Path);
SqlDataReader RolePageDr = BLL.Users.RolesPage(MyPage);
while (RolePageDr.Read())
{
role = RolePageDr["Roles"].ToString();
Session["Roles"] = role;
}
}
if (Page.User.IsInRole(Rolepage) != true)
{
Response.Redirect("~/MsgPage.aspx");
}
else
Response.Redirect(MyPage);
}
}
Session 保留该值并防止对数据库进行持续检查,但当它过期时,页面会重新加载它并将其再次存储在会话中。