我正在修复朋友的密码。我在母版页中遇到会话值问题。 我在主页中检查会话是空的还是空的,如果它是空的,则转到登录页面。 但是由masterpage创建的其他页面永远不会起作用。
if (Session["user"] != null && Session["user"] != "")
{ }
else
{
Response.Redirect("/Account/Login.aspx?link=" + System.Web.HttpContext.Current.Request.Url.PathAndQuery);
}
我尝试使用Session [" user"]。ToString()但结果相同。
其他页面通过此会话有其他控件,因此如果您不登录,它总是会出错。
<%@ Page Title="" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
MaintainScrollPositionOnPostback="true" CodeFile="document.aspx.cs" Inherits="document" %>
答案 0 :(得分:5)
基于此:
但是back.master的page_load中的会话控制在default.aspx page_load之后触发,所以它给出了错误“session is null”
这里的根本问题很简单......您需要完全理解ASP.Net page life-cycle
快速浏览一下:
基本上你的假设是错误的:
然后我创建普通的aspx页面,其名称为default.aspx,派生自back.master
来自MSDN:
主页面的行为类似于页面上的子控件:主页面Init事件发生在页面Init和Load事件之前,主页面Load事件发生在页面Init和Load事件之后
可悲的是,ASP.Net 并非来自母版页为什么?因为母版页被视为一个控件,所以真正发生的是母版页是Page
的子控件
(最佳推荐)创建自定义HttpModule
并检查Session
对象。我认为最适合您需求的事件是:Application_AuthenticateRequest
。这是您可以选择的完整事件列表:(顺便说一句,没有必要创建新的HttpModule,您可以使用Web应用程序的 Global.asax 文件订阅事件,仅使用HttpModule如果你想封装逻辑以重用它)
欲了解更多信息:
创建一个继承自Page
的通用页面,并将检查代码放在PreLoad
或Load
事件中,这两个事件都可以使用,并最终从此继承所有页面页
(不推荐)如果要将检查封装在母版页中,可以使用Init
事件
答案 1 :(得分:1)
IIS具有用于身份验证和授权的标准方法。
如果您想在用户未登录时限制对您网站某些区域的访问,那么配置中有一些机制允许:
在您的web.config中,您可以添加:
<location path="LoginRequiredDir">
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</location>
如果用户未登录,则会自动将用户带到登录页面。
答案 2 :(得分:1)
修复:它将解决您的问题。
protected void Page_Init(object sender, EventArgs e)
{
if (Session["master"] != null)
{ }
else
{
Response.Redirect("login.aspx?link=" + System.Web.HttpContext.Current.Request.Url.PathAndQuery);
}
}
答案 3 :(得分:1)
我也遇到过类似的问题。我将true
用于Response.Redirect
方法,以便其余的加载应该终止。 Ref。我检查了母版页Page_Init
中的会话值,如下所示。
public partial class Dashboard : System.Web.UI.MasterPage
{
protected void Page_Init(object sender, EventArgs e)
{
if (Session["RoleId"] == null || Session["RoleId"].ToString() == "")
{
Response.Redirect("/account", true);
}
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
setUserInfo();
}
}
}
希望它有所帮助。
答案 4 :(得分:0)
您可以通过以下方式定义上述代码Page_Load
方法:
protected void Page_Load(object sender, EventArgs e)
{
if (Session["user"] != null && Session["user"].ToString() != "")
{
//do code here
}
else
{
Response.Redirect("/Account/Login.aspx?link=" + System.Web.HttpContext.Current.Request.Url.PathAndQuery);
}
}