Asp.net PageBase学习总结
ASP.NET 常用方法類 - PageBase 頁面基類
https://blog.csdn.net/mikemiller2/article/details/7452825
if ($ != jQuery) { $ = jQuery.noConflict(); } var isLogined = true; var cb_blogId = 50056;
var cb_entryId = 1615409; var cb_blogApp = "asingna"; var cb_blogUserGuid = "0fee16b0-1cf5
-dd11-9e4d-001cf0cd104b"; var cb_entryCreatedDate = '2009/12/2 15:44:00';
========
asp.net中使用BasePage判斷權限
?
https://blog.csdn.net/cdefg198/article/details/8854001
using System; using System.Collections.Generic; using System.Linq; using System.Web;using Prima.CRM.BLL; using Prima.CRM.Model; using System.Text; using IcoLync.LogManager;/// <summary> ///BasePage 的摘要說明 /// </summary> public class BasePage : System.Web.UI.Page {static BasePage(){}private UserInfo _ui;protected virtual UserInfo Ui{get{if (Session["UserInfo"] != null)_ui = (UserInfo)Session["UserInfo"];else{if (Request.Cookies["UserName"] != null){_ui = UsersBLL.GetUserByUserName(Request.Cookies["UserName"].Value);Session["UserInfo"] = _ui;}}return _ui;}set { _ui = value; }}protected override void OnPreLoad(EventArgs e){base.OnPreLoad(e);if (base.Request.Cookies["UserName"] == null)base.Response.Redirect("~/Default.aspx");}#region 基類方法?/// <summary>/// 彈出頁面/// </summary>/// <param name="url"></param>public void OpenUrl(string url){string script = string.Format("<script language='JavaScript'>window.open('" + "{0}" + "','" + "','');<", url);script += "/";script += "script>";ClientScript.RegisterStartupScript(this.GetType(), System.Guid.NewGuid().ToString (), script);}/// <summary>/// 返回上一頁/// </summary>public void JavascriptGoBack(){string script = "<script>history.go(-1);</script>";ClientScript.RegisterStartupScript(this.GetType(), System.Guid.NewGuid().ToString (), script);}/// <summary>/// 執行JavaScript方法/// </summary>/// <param name="script"></param>public void JavascriptFun(string script){string AllScript = string.Format("<script>{0}</script>", script);ClientScript.RegisterStartupScript(this.GetType(), System.Guid.NewGuid().ToString (), AllScript);}/// <summary>/// 關閉窗口/// </summary>public void JavascriptClose(){string script = "<script>window.opener = null;window.close();</script>";ClientScript.RegisterStartupScript(this.GetType(), System.Guid.NewGuid().ToString (), script);}/// <summary>/// 跳轉到其他頁面/// </summary>/// <param name="url">頁面地址</param>public void JavascriptGoUrl(string url){string script = string.Format("<script>location = '{0}';</script>", url);ClientScript.RegisterStartupScript(this.GetType(), System.Guid.NewGuid().ToString (), script);}/// <summary>/// 顯示信息并跳轉頁面/// </summary>/// <param name="message"></param>/// <param name="url"></param>public void ShowMessageAndGoUrl(string message, string url){string script = string.Format("<script>alert('{0}');location.href='{1}';</script>", message, url);ClientScript.RegisterStartupScript(this.GetType(), System.Guid.NewGuid().ToString (), script);}/// <summary>/// 返回上一頁/// </summary>protected bool GoBack(){if (ViewState["BackUrl"] != null){Response.Redirect(ViewState["BackUrl"].ToString());return true;}elsereturn false;}#endregion 基類方法 }BasePage.cs其他頁面繼承:
public partial class Index : BasePage
========
ASP.NET 使用PageBase來控制用戶登陸
https://blog.csdn.net/weixin_34406061/article/details/86036895
ASP.NET 使用PageBase來控制用戶登陸,有時候發現在Web.Config文件里面寫了禁止匿名登錄的代碼以
后,要么就全部都登錄不了網頁,要么就是知道頁面的名稱,如Default.Aspx,然后在地址欄直接輸入
路徑然后回車就進入系統了,可能是配置文件沒有寫好,總之覺得這種方法不是很好,還是使用
PageBase來判斷IE產生的Session數量要好一點,如下:
這個PageBase類:
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts;/// <summary> ///PageBase 的摘要說明 /// </summary> public class PageBase : System.Web.UI.Page {public PageBase(){////TODO: 在此處添加構造函數邏輯//}private string sessionUserName;private string sessionPassword;public string SessionUserName{get { return this.sessionUserName; }}public string SessionPassword{get { return this.sessionPassword; }} ?protected override void OnInit(EventArgs e){if (base.Session["UserName"] == null || Session.Count < 2){Response.Redirect("~/Login.aspx");}else{this.sessionUserName = Session["UserName"].ToString();this.sessionPassword = Session["Password"].ToString(); ? ? ? ? ? ?}} }然后在主頁面里面繼承這個PageBase類,
public partial class _Default : PageBase
{
? ? protected void Page_Load(object sender, EventArgs e)
? ? {
? ? }
}
========
Asp.net PageBase繼承
https://blog.csdn.net/longvslove/article/details/7051677
?加載對應Load事件和OnLoad方法,對于這個事件,相信大多數朋友都會比較熟悉,用VS.Net生成的頁面
中的Page_Load方法就是響應Load事件的方法,對于每一次請求,Load事件都會觸發,Page_Load方法也
就會執行,相信這也是大多數人了解ASP.Net的第一步。?
? ? ? ? ? ? ? ? ? Page_Load方法響應了Load事件,這個事件是在System.Web.WebControl.Control類
中定義的(這個類是Page和所有服務器控件的祖宗),并且在OnLoad方法中被觸發。?
??? ? ? ? ? ? ? ? ? 很多人可能碰到過這樣的事情,寫了一個PageBase類,然后在Page_Load中來驗證用
戶信息,結果發現不管驗證是否成功,子類頁面的Page_Load總是會先執行,這個時候很可能留下一些安
全性的隱患,用戶可能在沒有得到驗證的情況下就執行了子類中的Page_Load方法。?
? ? ? ? ? ? ? ? ? 出現這個問題的原因很簡單,因為Page_Load方法是在OnInit中被添加到Load事件中
的,而子類的OnInit方法中是先添加了Load事件,然后再調用base.OnInit,這樣就造成了子類的
Page_Load被先添加,那么先執行了。?
? ? ? ? ? ? ? ? ? 要解決這個問題也很簡單,有兩種方法:?
1) ? ? ? 在PageBase中重載OnLoad方法,然后在OnLoad中驗證用戶,然后調用base.OnLoad,因為Load
事件是在OnLoad中觸發,這樣我們就可以保證在觸發Load事件之前驗證用戶。?
2) ? ? ? 在子類的OnInit方法中先調用base.OnInit,這樣來保證父類先執行Page_Load
?
using System;?
using System.Data;?
using System.Configuration;?
using System.Web;?
using System.Web.Security;?
using System.Web.UI;?
using System.Web.UI.HtmlControls;?
using System.Web.UI.WebControls;?
using System.Web.UI.WebControls.WebParts;
/// <summary>?
///first write by ?
///up by ahuinan?
/// </summary>?
public class PageBase:System.Web.UI.Page?
{?
public PageBase()?
{?
//?
//TODO: 在此處添加構造函數邏輯?
//?
}
protected override void OnInit(EventArgs e)?
{?
base.OnInit(e);?
this.Load += new System.EventHandler(PageBase_Load);?
this.Error += new System.EventHandler(PageBase_Error);
}
//錯誤處理?
protected void PageBase_Error(object sender, System.EventArgs e)?
{?
string errMsg = string.Empty;?
Exception currentError = HttpContext.Current.Server.GetLastError();?
errMsg += "<h1>系統錯誤:</h1><hr/>系統發生錯誤, " +?
"該信息已被系統記錄,請稍后重試或與管理員聯系。<br/>" +?
"錯誤地址: " + Request.Url.ToString() + "<br/>" +?
"錯誤信息: " + currentError.Message.ToString() + "<hr/>" +?
"<b>Stack Trace:</b><br/>" + currentError.ToString();?
HttpContext.Current.Response.Write(errMsg);?
Server.ClearError();?
}
private void PageBase_Load(object sender, EventArgs e)?
{?
if (!Page.IsPostBack)?
{?
if (HttpContext.Current.Session["username"] != null)?
{?
HttpContext.Current.Response.Write("登陸測試");?
}?
else?
{?
HttpContext.Current.Response.Write("你不是阿會楠,不要登陸");?
}?
}?
}?
}
========
關于asp.net繼承pagebase后開發時頁面的布局預覽不出來了
?
,提示創建控件出錯,運行后看布局是沒有
問題的,
public class PageBase : System.Web.UI.Page
{
#region 驗證是否登陸
protected override void OnInit(EventArgs e)
{
}
#endregion
/// <summary>
/// 獲取登錄用戶的各項信息
/// </summary>
/// <param name="UserName"></param>
/// <returns></returns>
public Maticsoft.Model.user UserInformation(string UserName)
{
}
/// <summary>
/// 獲取登錄用戶的姓名
/// </summary>
/// <param name="UserName"></param>
/// <returns></returns>
public string Name(string UserName) {
}
#region Md5加密
/// <summary>
/// Md5加密
/// </summary>
/// <param name="Str">需加密值</param>
/// <returns>Md5加密值</returns>
public string Md5(string Str)
{
MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider();
return BitConverter.ToString(provider.ComputeHash(Encoding.Default.GetBytes(Str))).Replace
("-", "").ToUpper();
}
#endregion
/// <summary>
/// 彈出一個提示框,確定轉向新URL
/// </summary>
/// <param name="Str1">提示信息</param>
/// <param name="Url">新的URL</param>
public void AlertAndParentChangUrl(string Str1, string Url)
{
HttpContext.Current.Response.Write(@"<script>alert('系統提示:\n\n" + Str1 + "');if
(parent.location!=null){parent.location='" + Url + "';}else{window.location='" + Url +
"';}</script>");
}
}
你試試這樣:
比如A頁面 A:PageBase 確保A類是第一個類
如果A.aspx.cs 出現A不是第一個類 可能無法預覽。
class B{}
class A:PageBase{}
還有你嘗試重新關閉項目,重新打開看看 .net頁面有時會出現無法預覽的情況
都是第一個類,重新打開也是一樣,無法預覽,還有沒有別的辦法
你看你頁面布局中是否缺少閉合元素 比如<div> 你少寫一個</div>
<table>你少寫一個</table> 確保成對出現
========
asp.net pagebase獲取緩存的方法
https://www.cnblogs.com/muxueyuan/p/5579964.html
public string GetSysConfigByKey(string key)
{
? ? if (object.Equals(HttpContext.Current.Cache["Cache_SysConfig"], null))
? ? {
? ? ? ? this.LoadSysConfigToCache();
? ? }
? ? Hashtable hashtable = (Hashtable)HttpContext.Current.Cache["Cache_SysConfig"];
? ? if (hashtable.ContainsKey(key))
? ? {
? ? ? ? return hashtable[key].ToString();
? ? }
? ? return "";
}
寫入緩存
public void LoadSysConfigToCache()
{
? ? try
? ? {
? ? ? ? if (object.Equals(HttpContext.Current.Cache["Cache_SysConfig"], null))
? ? ? ? {
? ? ? ? ? ? DataTable allSysConfig = new SysConfigBLL().GetAllSysConfig();
? ? ? ? ? ? Hashtable hashtable = new Hashtable();
? ? ? ? ? ? foreach (DataRow row in allSysConfig.Rows)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? hashtable.Add(row["ConfigKey"].ToString(), row["ConfigValue"].ToString());
? ? ? ? ? ? }
? ? ? ? ? ? HttpContext.Current.Cache.Insert("Cache_SysConfig", hashtable);
? ? ? ? }
? ? }
? ? catch (Exception exception)
? ? {
? ? ? ? ExceptionLogFactory.CreateObject(enuExceptionType.File, exception);
? ? ? ? throw;
? ? }
}
========
繼承System.Web.UI.Page的頁面基類
https://blog.csdn.net/my98800/article/details/61623952
服務器端的page類
所有我們編寫的頁面都繼承自page類,可見page類是非常重要的,page類提供了哪些功能,直接決定了
我們的頁面類可以繼承什么功能,或者說,直接決定了我們的頁面類功能的強大與否!那么,page類實
現了什么功能呢?如前所述的三個客戶端的事實,頁面類要管理ViewState,還要管理事件。page類起碼
要提供這些功能以供我們的頁面類重載或者調用。
page類提供了四個順序執行的事件Init,Load,PreRender和Unload,這四個事件是一條主線,依次標明了
page類執行的各個階段。init事件發生在所有服務器端控件的狀態(ViewState)被存儲之前。load事件
發生在所有服務器端控件的狀態被存儲之后和所有的事件被觸發之前。PreRender事件發生在所有事件被
觸發之后和要回發給客戶端的html還沒有回發(這個過程也叫"呈現")之前。unload事件發生在所有
html都回發完成以后。從這四個事件可以看到page類的大致執行步驟。
詳細的page類事件順序是這樣的:獲得客戶端的post請求-〉page類的繼承類被構造-〉page類的
ProcessRequest方法被調用->init事件被執行->page類的虛函數CreateChildControls被調用->服務器端
控件的狀態(來自post變量和ViewState)被存儲->load事件被執行->我們自定義的服務器端控件的事件
被執行->PreRender事件被執行->page類的虛函數Render方法被調用->page類的虛函數RenderChildren方
法被調用->Http響應發往客戶端->unload事件被執行->page類的繼承類被解構。我們知道一個頁面上的
控件很多是包含(父子)關系,所以這里的CreateChildControls和RenderChinldren函數應該就不難理
解了。
這個事件順序是理解asp.net頁面類的關鍵,和前面客戶端的三個事實結合起來理解,就可以解釋
asp.net怎么樣把客戶端和服務器端結合起來,從而實現從腳本編程轉移到面向對象編程。無論是微軟提
供的webcontrols,或者是用戶自定義控件,涉及到客戶端和服務器端交互,原理都與此類似。
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace CommonClass
{
?/// <summary>
?/// 頁面的基類。 ///?
?/// </summary>
?public class PageBase:System.Web.UI.Page
?{
? public PageBase()
? {
? ?//
? ?// TODO: 在此處添加構造函數邏輯
? ?// ??
? }
? /// <summary>
? /// 模塊名稱
? /// </summary>
? public String ModuleName
? {
? ?set{ViewState["ModuleName"]=value;}
? ?get{return ViewState["ModuleName"].ToString();}
? }
? private string _Message;
? /// <summary>
? /// 向用戶顯示信息提示
? /// </summary>
? public String Message
? {
? ?get{return _Message;}
? ?set{_Message = value;}
? }
? /// <summary>
? /// 檢查是否有特定的權限
? /// </summary>
? /// <param name="sec">安全選項</param>
? /// <returns></returns>
// ?public bool CheckPermissionSuccess(Framework.SecurityOption sec)
// ?{
// ? //TODO:實現Framework.Security類,如瀏覽、修改、管理權限
// ? return Framework.Security.CheckValid(this.ModuleName,sec);
// ?}
? /// <summary>
? /// 頁最頂端的PlaceHolder
? /// </summary>
? public System.Web.UI.WebControls.PlaceHolder plhTopHolder;
? /// <summary>
? /// 頁最底端的PlaceHolder
? /// </summary>
? public System.Web.UI.WebControls.PlaceHolder plhBottomHolder;
??
? protected override void OnInit(EventArgs e)
? {
? ?//初始化控件
? ?plhTopHolder = new PlaceHolder();
? ?plhBottomHolder = new PlaceHolder();
? ?
? ?//添加頂端PlaceHolder
? ?Control form1 = this.FindControl("Form1");
? ?if (form1 != null) form1.Controls.AddAt(0,plhTopHolder);
? ?//添加頁眉的用戶自定義控件
? ?ITemplate Header = Page.LoadTemplate("~/Controls/Header.ascx");
? ?this.plhTopHolder.Controls.Add(Header);
? ?//event
? ?this.Load+=new EventHandler(PageBase_Load);
? ?this.Error+=new EventHandler(PageBase_Error);
? ?this.PreRender+=new EventHandler(PageBase_PreRender);
? ?base.OnInit (e);
? }
? private void PageBase_Load(object sender, EventArgs e)
? {
? ?//添加底端PlaceHolder
? ?Control form1 = this.FindControl("Form1");
? ?if (form1 != null) form1.Controls.Add(plhBottomHolder);
? ?//添加頁腳的用戶自定義控件
? ?//ITemplate Footer = Page.LoadTemplate("~/Controls/Footer.ascx");
? ?//this.plhBottomHolder.Controls.Add(Footer);
? }
? private void PageBase_Error(object sender, EventArgs e)
? {
#if !Debug
// ? Exception exc = Server.GetLastError();
// ? 記錄未處理的錯誤
// ? XMLLog.AddErrorLog(exc,userName);
// ? Server.Transfer("~/PageError.aspx?error=" + Server.HtmlEncode(exc.Message));
#endif
? }
? private void PageBase_PreRender(object sender, EventArgs e)
? {
? ?//添加信息提示
? ?if (this._Message != null && this._Message != String.Empty)
? ?{
? ? LiteralControl litMessage = new LiteralControl("<div class=\"CssMessage\"><p>" +
Message + "</p></div>");
? ? plhTopHolder.Controls.Add(litMessage);
? ?}
? }
?}
}
========
關于ASP.NET中使用MasterPage和PageBase頁面基類的一些體會
?
https://yq.aliyun.com/articles/468601
摘要: 概念:MasterPage是ASP.NET中用于解決頁面統一性的一個母版頁,各個頁面可以使用統一的
MasterPage來規范頁面風格。(MSDN注解)母版頁用作 ASP.NET Web 應用程序中內容頁的模板容器和合
并頁。
概念:MasterPage是ASP.NET中用于解決頁面統一性的一個母版頁,各個頁面可以使用統一的MasterPage
來規范頁面風格。(MSDN注解)母版頁用作 ASP.NET Web 應用程序中內容頁的模板容器和合并頁。母版
頁為在一組內容頁之間共享結構和內容提供了一條方便的途徑。可使用內容占位符定義母版頁中要用內
容頁的內容加以替換的部分。
PageBase繼承System.Web.UI.Page類,網站中的各個頁面繼承PageBase類,在PageBase類中可以做統一
的邏輯控制
最近開發中涉及到MasterPage和PageBase的使用問題,WEB應用程序中的大多數頁面都繼承了MasterPage
頁面,具備統一的風格及部分代碼邏輯,但是,也有一部分頁面是需要特殊處理的并不需要繼承
MaterPage,比如一些彈出頁面或特別處理的頁面等等,這就需要另外再寫一個頁面基類來處理身份驗證
,URL參數控制,頁面容錯等邏輯,于是選擇了PageBase,考慮到職責應該單一,讓MasterPage只是處理
跟界面統一風格有關的部分,而PageBase處理統一的邏輯控制,項目進行的還算順利。
解決問題
但是不久后開發中又出現了另外一個問題,由于項目特殊性,需要我們的程序支持同一臺機器可以同時
登錄兩個用戶,Session并不能很好的解決這個問題,于是我們設計了一個方案就是用戶登錄后其ID隨
URL存入頁面上的一個隱藏文本框內,但這個TextBox放置的位置是個問題,因為系統中現有的頁面一部
分使用了MasterPage,一部分頁面并沒有使用MaterPage,如果在MasterPage中放置的話,有些頁面會因
為沒有這個文本框而丟失用戶信息了,于是我們讓系統中的所有頁面都繼承了PageBase,并在PageBase
中動態向當前頁面添加TextBox控件來存儲用戶ID,當每個頁面加載的時候基類會判斷兩個條件
添加控件:向頁面添加TextBox來存儲用戶ID,需要先判斷當前頁面是否采用了母版頁,
如果采用了母版頁則在母版頁的某個ContentPlaceHolder中放置一個TextBox,
如果沒有采用則直接在頁面的Form中添加TextBox,
如下圖:?
這樣可以保證系統中所有采用PageBase作為基類的頁面中都會含有這個文本框控件;
控件賦值:給頁面中的TextBox賦值,
由于這種方法必須要求頁面跳轉是Server.Transfer或者控件PostBackUrl到服務器,所以需要判斷頁面
的URL中是否有參數傳入,因為用戶登錄或其他特定操作時ID將會作為URL傳入,如果有參數則取得參數
并賦值給當前頁面的TextBox(這里需要判斷本頁是否采用了母版頁,若采用則直接賦值給母版頁中的
TextBox,若沒有采用則直接賦值給當前頁面的TextBox)
如果沒有參數則判斷當前頁面是否具備PreviousPage屬性值,如果具備則判斷PreviousPage是否采用了
母版頁并從頁面上的TextBox中取值賦給當前頁面中的TextBox,如果沒有PreviousPage屬性也沒有URL參
數值則終止賦值操作。
如圖:
頁面取值:我們可以寫一個公共方法int GetUserID(this.Page)來取得當前頁面的用戶ID,這樣的話只
要牽扯到取得當前用戶ID就可以直接調用方法來取了,并且節省了很多的代碼。
取得頁面TextBox值的公共方法如下:
至此,頁面中必有這個控件,且控件中必然會有值,開發時可以在任何需要使用當前用戶ID的地方直接
調用GetUserID(this.Page)方法來取得當前頁面的用戶ID,從而實現了用戶ID跟頁面一起走的效果,避
免了使用Session造成的會話覆蓋。
這就是MasterPage和PageBase搭配完成的一個小功能:兩個人可以同時使用一臺電腦登錄同一個系統。
您有更好的方法么?
========
?
總結
以上是生活随笔為你收集整理的Asp.net PageBase学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 认识windows消息机制和Spy++工
- 下一篇: CSS父级子级学习总结