2014-02-15 54 views
0

在一個Web窗體項目中,我使用MasterPage進行用戶角色和其他頁面從MasterPage繼承。 我嘗試使用此代碼到母版的裝載功能:從MasterPage繼承

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),從母版,這繼承了這個管理頁面加載函數再次運行一次。

+0

發生這個問題的原因是,無論何時我們借用任何頁面,並且如果該頁面是從母版頁繼承的,那麼首先我們的母版頁將加載並且IsPostBack將始終爲假。 –

+0

你是否想根據角色類型更改母版頁? –

+0

你有沒有看過使用global.asax事件'Application_AuthenticateRequest'來代替? –

回答

0

它會反覆運行;這是無國界編程的本質。但是你可以做的是使用會話來存儲它,然後只重新加載它時,會不存在,如:

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); 
    } 
} 

會話保存價值,並防止數據庫的不斷檢查,但何時到期,頁面重新加載並將其存儲在會話中。