這篇文章給大家介紹asp.net中怎么自定義頁面基類,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:申請(qǐng)域名、虛擬主機(jī)、營銷軟件、網(wǎng)站建設(shè)、東光網(wǎng)站維護(hù)、網(wǎng)站推廣。一、BasePage類
1、代碼
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Reflection; namespace DotNet.Common.WebForm { using DotNet.Common.Model; using DotNet.Common.Util; public class BasePage : System.Web.UI.Page { public BasePage() { } protected override void OnInit(EventArgs e) { base.OnInit(e); //CancelFormControlEnterKey(this.Page.Form.Controls); //取消頁面文本框的enter key } #region 取消頁面文本控件的enter key功能 ////// 在這里我們給Form中的服務(wù)器控件添加客戶端onkeydown腳步事件,防止服務(wù)器控件按下enter鍵直接回發(fā) /// /// public virtual void CancelFormControlEnterKey(ControlCollection controls) { //向頁面注冊(cè)腳本 用來取消input的enter key功能 RegisterUndoEnterKeyScript(); foreach (Control item in controls) { //服務(wù)器TextBox if (item.GetType() == typeof(System.Web.UI.WebControls.TextBox)) { WebControl webControl = item as WebControl; webControl.Attributes.Add("onkeydown", "return forbidInputKeyDown(event)"); } //html控件 else if (item.GetType() == typeof(System.Web.UI.HtmlControls.HtmlInputText)) { HtmlInputControl htmlControl = item as HtmlInputControl; htmlControl.Attributes.Add("onkeydown", "return forbidInputKeyDown(event)"); } //用戶控件 else if (item is System.Web.UI.UserControl) { CancelFormControlEnterKey(item.Controls); //遞歸調(diào)用 } } } ////// 向頁面注冊(cè)forbidInputKeyDown腳本 /// private void RegisterUndoEnterKeyScript() { string js = string.Empty; System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append("function forbidInputKeyDown(ev) {"); sb.Append(" if (typeof (ev) != \"undefined\") {"); sb.Append(" if (ev.keyCode || ev.which) {"); sb.Append(" if (ev.keyCode == 13 || ev.which == 13) { return false; }"); sb.Append(" } } }"); js = sb.ToString(); if (!this.Page.ClientScript.IsClientScriptBlockRegistered("forbidInput2KeyDown")) this.Page.ClientScript.RegisterClientScriptBlock(typeof(Page), "forbidInput2KeyDown", js, true); } #endregion #region 利用反射取/賦頁面控件的值 ////// 從頁面中取控件值,并給對(duì)象賦值 /// /// 要被賦值的對(duì)象類型 ///public virtual BaseObj GetFormData(Type dataType) { BaseObj data = (BaseObj)Activator.CreateInstance(dataType);//實(shí)例化一個(gè)類 Type pgType = this.GetType(); //標(biāo)識(shí)當(dāng)前頁面 BindingFlags bf = BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic;//反射標(biāo)識(shí) PropertyInfo[] propInfos = data.GetType().GetProperties();//取出所有公共屬性 foreach (PropertyInfo item in propInfos) { FieldInfo fiPage = pgType.GetField(item.Name, bf);//從頁面中取出滿足某一個(gè)屬性的字段 if (fiPage != null) //頁面的字段不為空,代表存在一個(gè)實(shí)例化的控件類 { object value = null; Control pgControl = (Control)fiPage.GetValue(this); //根據(jù)屬性,找到頁面對(duì)應(yīng)控件,這要求頁面控件命名必須和對(duì)象的屬性一一對(duì)應(yīng)相同 //下面取值 Type controlType = pgControl.GetType(); if (controlType == typeof(Label)) { value = ((Label)pgControl).Text.Trim(); } else if (controlType == typeof(TextBox)) { value = ((TextBox)pgControl).Text.Trim(); } else if (controlType == typeof(HtmlInputText)) { value = ((HtmlInputText)pgControl).Value.Trim(); } else if (controlType == typeof(HiddenField)) { value = ((HiddenField)pgControl).Value.Trim(); } else if (controlType == typeof(CheckBox)) { value = (((CheckBox)pgControl).Checked);//復(fù)選框 } else if (controlType == typeof(DropDownList))//下拉框 { value = ((DropDownList)pgControl).SelectedValue; } else if (controlType == typeof(RadioButtonList))//單選框列表 { value = ((RadioButtonList)pgControl).SelectedValue; if (value != null) { if (value.ToString().ToUpper() != "TRUE" && value.ToString().ToUpper() != "FALSE") value = value.ToString() == "1" ? true : false; } } else if (controlType == typeof(Image)) //圖片 { value = ((Image)pgControl).ImageUrl; } try { object realValue = null; if (item.PropertyType.Equals(typeof(Nullable ))) //泛型可空類型 { if (value != null) { if (string.IsNullOrEmpty(value.ToString())) { realValue = null; } else { realValue = DateTime.Parse(value.ToString()); } } } else if (item.PropertyType.Equals(typeof(Nullable))) //可空類型 { realValue = value; } else { try { realValue = Convert.ChangeType(value, item.PropertyType); } catch { realValue = null; } } item.SetValue(data, realValue, null); } catch (FormatException fex) { DotNet.Common.Util.Logger.WriteFileLog(fex.Message, HttpContext.Current.Request.PhysicalApplicationPath + "LogFile"); throw fex; } catch (Exception ex) { DotNet.Common.Util.Logger.WriteFileLog(ex.Message, HttpContext.Current.Request.PhysicalApplicationPath + "LogFile"); throw ex; } } } return data; } /// /// 通過對(duì)象的屬性值,給頁面控件賦值 /// /// public virtual void SetFormData(BaseObj data) { Type pgType = this.GetType(); BindingFlags bf = BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Static; PropertyInfo[] propInfos = data.GetType().GetProperties(); foreach (PropertyInfo item in propInfos) { FieldInfo myField = pgType.GetField(item.Name, bf); if (myField != null) { Control myControl = (Control)myField.GetValue(this); //根據(jù)屬性名取到頁面控件 object value = item.GetValue(data, null); //取對(duì)象的屬性值 Type propType = item.PropertyType; if (value != null) { Type valueType = value.GetType(); try { Type controlType = myControl.GetType(); if (controlType == typeof(Label)) { if (valueType == typeof(DateTime)) { ((Label)myControl).Text = (Convert.ToDateTime(value)).ToShortDateString(); } else { ((Label)myControl).Text = value.ToString(); } } else if (controlType == typeof(TextBox)) { if (valueType == typeof(DateTime)) { ((TextBox)myControl).Text = (Convert.ToDateTime(value)).ToShortDateString(); } else { ((TextBox)myControl).Text = value.ToString(); } } else if (controlType == typeof(HtmlInputText)) { if (valueType == typeof(DateTime)) { ((HtmlInputText)myControl).Value = (Convert.ToDateTime(value)).ToShortDateString(); } else { ((HtmlInputText)myControl).Value = value.ToString(); } } else if (controlType == typeof(HiddenField)) { ((HiddenField)myControl).Value = value.ToString(); } else if (controlType == typeof(CheckBox)) { if (valueType == typeof(Boolean)) //布爾型 { if (value.ToString().ToUpper() == "TRUE") ((CheckBox)myControl).Checked = true; else ((CheckBox)myControl).Checked = false; } else if (valueType == typeof(Int32)) //整型 (正常情況下,1標(biāo)識(shí)選擇,0標(biāo)識(shí)不選) { ((CheckBox)myControl).Checked = string.Compare(value.ToString(), "1") == 0; } } else if (controlType == typeof(DropDownList)) { try { ((DropDownList)myControl).SelectedValue = value.ToString(); } catch { ((DropDownList)myControl).SelectedIndex = -1; } } else if (controlType == typeof(RadioButton)) { if (valueType == typeof(Boolean)) //布爾型 { if (value.ToString().ToUpper() == "TRUE") ((RadioButton)myControl).Checked = true; else ((RadioButton)myControl).Checked = false; } else if (valueType == typeof(Int32)) //整型 (正常情況下,1標(biāo)識(shí)選擇,0標(biāo)識(shí)不選) { ((RadioButton)myControl).Checked = string.Compare(value.ToString(), "1") == 0; } } else if (controlType == typeof(RadioButtonList)) { try { if (valueType == typeof(Boolean)) //布爾型 { if (value.ToString().ToUpper() == "TRUE") ((RadioButtonList)myControl).SelectedValue = "1"; else ((RadioButtonList)myControl).SelectedValue = "0"; } else ((RadioButtonList)myControl).SelectedValue = value.ToString(); } catch { ((RadioButtonList)myControl).SelectedIndex = -1; } } else if (controlType == typeof(Image)) { ((Image)myControl).ImageUrl = value.ToString(); } } catch (FormatException fex) { DotNet.Common.Util.Logger.WriteFileLog(fex.Message, HttpContext.Current.Request.PhysicalApplicationPath + "LogFile"); } catch (Exception ex) { DotNet.Common.Util.Logger.WriteFileLog(ex.Message, HttpContext.Current.Request.PhysicalApplicationPath + "LogFile"); } } } } } #endregion #region 日志處理 ////// 出錯(cuò)處理:寫日志,導(dǎo)航到公共出錯(cuò)頁面 /// /// protected override void OnError(EventArgs e) { Exception ex = this.Server.GetLastError(); string error = this.DealException(ex); DotNet.Common.Util.Logger.WriteFileLog(error, HttpContext.Current.Request.PhysicalApplicationPath + "LogFile"); if (ex.InnerException != null) { error = this.DealException(ex); DotNet.Common.Util.Logger.WriteFileLog(error, HttpContext.Current.Request.PhysicalApplicationPath + "LogFile"); } this.Server.ClearError(); this.Response.Redirect("/Error.aspx"); } ////// 處理異常,用來將主要異常信息寫入文本日志 /// /// ///private string DealException(Exception ex) { this.Application["StackTrace"] = ex.StackTrace; this.Application["MessageError"] = ex.Message; this.Application["SourceError"] = ex.Source; this.Application["TargetSite"] = ex.TargetSite.ToString(); string error = string.Format("URl:{0}\n引發(fā)異常的方法:{1}\n錯(cuò)誤信息:{2}\n錯(cuò)誤堆棧:{3}\n", this.Request.RawUrl, ex.TargetSite, ex.Message, ex.StackTrace); return error; } #endregion } }
2、使用反射給控件賦值
根據(jù)id取一個(gè)員工(Employee),Employee類繼承自BaseObj類,根據(jù)這個(gè)客戶對(duì)象給頁面控件賦值:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Text; using System.Threading; namespace WebTest { using DotNet.Common.WebForm; using DotNet.Common.Model; using EntCor.Hrm.Model; public partial class _Default : BasePage { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { Employee employee = new Employee { ID = 1, UserName = "jeff wong", Address = "北京", IsLeave = false, RealName = "測(cè)試用戶", State = "2" }; this.SetFormData(employee); //給頁面控件賦值 } } } }
3、使用反射給對(duì)象賦值
點(diǎn)擊”測(cè)試”按鈕,將頁面控件(runat=server)的值賦給實(shí)體對(duì)象:
protected void btnSet_Click(object sender, EventArgs e) { Employee employee = (Employee)this.GetFormData(typeof(Employee)); StringBuilder sb = new StringBuilder(); sb.Append("登錄名:" + employee.UserName + "
"); sb.Append("真實(shí)姓名:" + employee.RealName + "
"); sb.Append("所在地:" + employee.Address + "
"); sb.Append("是否離職:" + employee.IsLeave + "
"); sb.Append("在職狀態(tài):" + employee.State + "
"); this.ltrContext.Text = sb.ToString(); }
總結(jié):
(1)、對(duì)于頁面中控件較多的情況,這個(gè)類里的反射取值和賦值的方法還是很有用的(比較惡心的是你要哼唧哼唧地對(duì)照實(shí)體類給頁面控件命名。kao,實(shí)體類有代碼生成器自動(dòng)生成我就忍了,頁面控件還要一一對(duì)應(yīng)地命名,估計(jì)很多程序員在這方面沒少花時(shí)間,還有就是不考慮反射對(duì)性能的影響)。不過從代碼的簡潔程度來看,這個(gè)確實(shí)顯得out了;不過呢,筆者習(xí)慣了,命名多就多一些吧,在找到穩(wěn)定可靠的解決方案之前,短時(shí)間看來是不會(huì)選擇改進(jìn)的了;
(2)、如果頁面中有用戶控件(UserControl),用戶控件里的子控件直接在頁面中就比較難取到了(你可能已經(jīng)看出問題的端倪來了),解決的方法就是在用戶控件里生成實(shí)體類(這個(gè)可以模仿BasePage寫一個(gè)BaseControl類,讓用戶控件繼承BaseControl,然后取值。本來想另開一篇介紹一下的,可是發(fā)現(xiàn)實(shí)現(xiàn)代碼雷同,放棄);
(3)、取消頁面文本框的enter key您可以參考《asp.net實(shí)現(xiàn)取消頁面表單內(nèi)文本輸入框Enter響應(yīng)的方法》;
(4)、異常處理見(二)。
二、異常處理
1、日志類(自己寫的一個(gè)簡單通用的文本日志處理類)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Web; namespace DotNet.Common.WebForm { ////// 日志類(常用的都是log4net,這里簡陋地實(shí)現(xiàn)一個(gè)寫入文本日志類) /// public static class LogUtil { ////// 寫入異常日志 /// /// public static void WriteFileLog(string exMsg) { string path = HttpContext.Current.Request.PhysicalApplicationPath + "LogFile"; FileStream fs = null; StreamWriter m_streamWriter = null; try { if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } path = path + "\\" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write); m_streamWriter = new StreamWriter(fs); m_streamWriter.BaseStream.Seek(0, SeekOrigin.End); m_streamWriter.WriteLine(DateTime.Now.ToString() + "\n"); m_streamWriter.WriteLine("-----------------------------------------------------------"); m_streamWriter.WriteLine("-----------------------------------------------------------"); m_streamWriter.WriteLine(exMsg); m_streamWriter.WriteLine("-----------------------------------------------------------"); m_streamWriter.WriteLine("-----------------------------------------------------------"); m_streamWriter.Flush(); } finally { if (m_streamWriter != null) { m_streamWriter.Close(); } if (fs != null) { fs.Close(); } } } } }
2、Error.aspx
這個(gè)比較無語。通常用來提供一個(gè)有好的出錯(cuò)頁面。對(duì)于開發(fā)人員,建議顯示完整的異常信息。
下面貼一個(gè)對(duì)開發(fā)人員有幫助的頁面:
(1)、設(shè)計(jì)頁面
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Error.aspx.cs" Inherits="Error" %>出錯(cuò)啦
(2)、實(shí)現(xiàn)代碼
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class ErrorPage : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { this.lblStackTrace.Text = this.Application["StackTrace"] as string; this.lblMessageError.Text = this.Application["MessageError"] as string; this.lblSourceError.Text = this.Application["SourceError"] as string; this.lblTagetSiteError.Text = this.Application["TargetSite"] as string; } }
關(guān)于asp.net中怎么自定義頁面基類就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。