亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

asp.net實現非常實用的自定義頁面基類(附源碼下載)

2024-07-10 13:29:45
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了asp.net實現非常實用的自定義頁面基類,包含日志處理、控件賦值、異常處理等功能,非常具有實用價值,需要的朋友可以參考下
 

本文實例講述了asp.net實現非常實用的自定義頁面基類。分享給大家供大家參考,具體如下:

看到前面幾篇文章(如:《asp.net實現利用反射,泛型,靜態方法快速獲取表單值到Model的方法》)想到的。下面總結發布一個筆者在開發中常用的一個自定義BasePage類,廢話不多說了,直接貼代碼。

一、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功能  /// <summary>  /// 在這里我們給Form中的服務器控件添加客戶端onkeydown腳步事件,防止服務器控件按下enter鍵直接回發  /// </summary>  /// <param name="controls"></param>  public virtual void CancelFormControlEnterKey(ControlCollection controls)  {   //向頁面注冊腳本 用來取消input的enter key功能   RegisterUndoEnterKeyScript();   foreach (Control item in controls)   {    //服務器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); //遞歸調用    }   }  }  /// <summary>  /// 向頁面注冊forbidInputKeyDown腳本  /// </summary>  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 利用反射取/賦頁面控件的值  /// <summary>  /// 從頁面中取控件值,并給對象賦值  /// </summary>  /// <param name="dataType">要被賦值的對象類型</param>  /// <returns></returns>  public virtual BaseObj GetFormData(Type dataType)  {   BaseObj data = (BaseObj)Activator.CreateInstance(dataType);//實例化一個類   Type pgType = this.GetType(); //標識當前頁面   BindingFlags bf = BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic;//反射標識   PropertyInfo[] propInfos = data.GetType().GetProperties();//取出所有公共屬性    foreach (PropertyInfo item in propInfos)   {    FieldInfo fiPage = pgType.GetField(item.Name, bf);//從頁面中取出滿足某一個屬性的字段    if (fiPage != null) //頁面的字段不為空,代表存在一個實例化的控件類    {     object value = null;     Control pgControl = (Control)fiPage.GetValue(this); //根據屬性,找到頁面對應控件,這要求頁面控件命名必須和對象的屬性一一對應相同     //下面取值     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);//復選框     }     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<DateTime>))) //泛型可空類型       {       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;  }  /// <summary>  /// 通過對象的屬性值,給頁面控件賦值  /// </summary>  /// <param name="data"></param>  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); //根據屬性名取到頁面控件     object value = item.GetValue(data, null); //取對象的屬性值     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標識選擇,0標識不選)        {         ((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標識選擇,0標識不選)        {         ((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 日志處理  /// <summary>  /// 出錯處理:寫日志,導航到公共出錯頁面  /// </summary>  /// <param name="e"></param>  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");  }  /// <summary>  /// 處理異常,用來將主要異常信息寫入文本日志  /// </summary>  /// <param name="ex"></param>  /// <returns></returns>  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引發異常的方法:{1}/n錯誤信息:{2}/n錯誤堆棧:{3}/n",    this.Request.RawUrl, ex.TargetSite, ex.Message, ex.StackTrace);   return error;  }  #endregion }}

2、使用反射給控件賦值

根據id取一個員工(Employee),Employee類繼承自BaseObj類,根據這個客戶對象給頁面控件賦值:

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 = "測試用戶", State = "2" };    this.SetFormData(employee); //給頁面控件賦值   }  } }}

3、使用反射給對象賦值

點擊”測試”按鈕,將頁面控件(runat=server)的值賦給實體對象:

protected void btnSet_Click(object sender, EventArgs e){ Employee employee = (Employee)this.GetFormData(typeof(Employee)); StringBuilder sb = new StringBuilder(); sb.Append("登錄名:" + employee.UserName + "<br/>"); sb.Append("真實姓名:" + employee.RealName + "<br/>"); sb.Append("所在地:" + employee.Address + "<br/>"); sb.Append("是否離職:" + employee.IsLeave + "<br/>"); sb.Append("在職狀態:" + employee.State + "<br/>"); this.ltrContext.Text = sb.ToString();}

總結:

(1)、對于頁面中控件較多的情況,這個類里的反射取值和賦值的方法還是很有用的(比較惡心的是你要哼唧哼唧地對照實體類給頁面控件命名。kao,實體類有代碼生成器自動生成我就忍了,頁面控件還要一一對應地命名,估計很多程序員在這方面沒少花時間,還有就是不考慮反射對性能的影響)。不過從代碼的簡潔程度來看,這個確實顯得out了;不過呢,筆者習慣了,命名多就多一些吧,在找到穩定可靠的解決方案之前,短時間看來是不會選擇改進的了;
(2)、如果頁面中有用戶控件(UserControl),用戶控件里的子控件直接在頁面中就比較難取到了(你可能已經看出問題的端倪來了),解決的方法就是在用戶控件里生成實體類(這個可以模仿BasePage寫一個BaseControl類,讓用戶控件繼承BaseControl,然后取值。本來想另開一篇介紹一下的,可是發現實現代碼雷同,放棄);
(3)、取消頁面文本框的enter key您可以參考《asp.net實現取消頁面表單內文本輸入框Enter響應的方法》;
(4)、異常處理見(二)。

二、異常處理

1、日志類(自己寫的一個簡單通用的文本日志處理類)

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;using System.Web;namespace DotNet.Common.WebForm{ /// <summary> /// 日志類(常用的都是log4net,這里簡陋地實現一個寫入文本日志類) /// </summary> public static class LogUtil {  /// <summary>  /// 寫入異常日志  /// </summary>  /// <param name="ex"></param>  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

這個比較無語。通常用來提供一個有好的出錯頁面。對于開發人員,建議顯示完整的異常信息。

下面貼一個對開發人員有幫助的頁面:

(1)、設計頁面

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Error.aspx.cs" Inherits="Error" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" ><head runat="server"> <title>出錯啦</title></head><body> <form id="form1" runat="server"> <div>  <table width='100%' align='center' style='font-size: 10pt; font-family: Trebuchet MS, Arial'>   <tr align='center'>    <td align="center" colspan="2">     <b>Error on page</b>    </td>   </tr>   <tr>    <td align='right' width="200">     <b>stackTrace :</b>    </td>    <td align='left'>     <asp:Label ID="lblStackTrace" runat="server"></asp:Label>    </td>   </tr>   <tr>    <td align='right'>     <b>Error message :</b>    </td>    <td align='left'>     <asp:Label ID="lblMessageError" runat="server"></asp:Label>    </td>   </tr>   <tr>    <td align='right'>     <b>Source :</b>    </td>    <td align='left'>     <asp:Label ID="lblSourceError" runat="server"></asp:Label>    </td>   </tr>   <tr>    <td align='right'>     <b>TargetSite :</b>    </td>    <td align='left'>     <asp:Label ID="lblTagetSiteError" runat="server"></asp:Label>    </td>   </tr>  </table> </div> </form></body></html>

(2)、實現代碼

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

完整實例代碼代碼點擊此處本站下載。

希望本文所述對大家asp.net程序設計有所幫助。



注:相關教程知識閱讀請移步到ASP.NET教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av免费观影| 亚洲高清不卡av| 亚洲精品美女久久久| 精品久久久久久亚洲精品| 国产精品爽爽爽| 91视频国产精品| 成人激情视频免费在线| 精品无人区太爽高潮在线播放| 欧美成人免费在线观看| 亚洲第一av在线| 欧美午夜片在线免费观看| 日韩大胆人体377p| 国产精品久久久久91| 欧美激情网站在线观看| 国产va免费精品高清在线| 日韩欧美在线视频免费观看| 亚洲欧美日韩中文在线制服| 久久精品影视伊人网| 亚洲国产精品字幕| 欧美亚洲视频在线看网址| 国产精品久久久久久久久久99| 久久色精品视频| 日韩乱码在线视频| 亚洲欧美成人网| 久久99国产精品久久久久久久久| 国产精品爽爽爽爽爽爽在线观看| 亚洲片国产一区一级在线观看| 欧美激情精品久久久久久大尺度| 精品亚洲aⅴ在线观看| 日韩av中文字幕在线免费观看| 欧美日韩亚洲网| 国产网站欧美日韩免费精品在线观看| 久久久久久这里只有精品| 欧美日韩亚洲一区二区| 亚洲女人初尝黑人巨大| 欧美黑人又粗大| 国产一区二区三区高清在线观看| 亚洲综合国产精品| 国产精品久久久久av免费| 日本精品视频在线| 久久精品国产视频| 国产v综合v亚洲欧美久久| 日韩电视剧在线观看免费网站| 国语自产精品视频在线看| 成人久久18免费网站图片| 国产精品91久久久| 亚洲一区二区三区四区视频| 国产精品久久在线观看| 成人免费网站在线看| 久久夜色精品亚洲噜噜国产mv| 久久精品这里热有精品| 亚洲jizzjizz日本少妇| 欧美多人爱爱视频网站| 欧美性极品xxxx做受| 九九热最新视频//这里只有精品| 欧美肥婆姓交大片| 91免费综合在线| 91精品国产高清自在线看超| 亚洲自拍在线观看| 91地址最新发布| 国产亚洲欧美日韩精品| 亚洲国产福利在线| 国产一区二区三区直播精品电影| 久久久久久久成人| 欧美日韩成人黄色| 久久精品夜夜夜夜夜久久| 懂色av影视一区二区三区| 亚洲乱亚洲乱妇无码| 91精品国产成人| 国产女人精品视频| 伊人一区二区三区久久精品| 久久精品国产亚洲精品| 蜜臀久久99精品久久久无需会员| 亚洲午夜激情免费视频| 91精品国产91久久久| 欧美视频在线观看免费网址| 日韩电影免费在线观看中文字幕| 久久69精品久久久久久国产越南| 在线激情影院一区| 国产97在线|亚洲| 欧美日韩亚洲视频一区| 亚洲第一国产精品| 最近2019好看的中文字幕免费| 欧美电影《睫毛膏》| 欧美激情欧美激情| 国产欧美韩国高清| 亚洲成人精品视频在线观看| 国产精品高潮呻吟久久av野狼| 岛国视频午夜一区免费在线观看| 免费av在线一区| 久久人人爽人人爽人人片av高请| 中文字幕日韩精品有码视频| 久久久亚洲影院你懂的| 国产日韩av在线播放| 亚洲精品免费一区二区三区| 久久91亚洲人成电影网站| 欧美大片免费观看在线观看网站推荐| 主播福利视频一区| 日韩美女免费线视频| 在线一区二区日韩| 国产女人精品视频| 一区二区欧美久久| 97在线观看视频| 日韩中文字幕网站| 国产精品视频26uuu| 一本大道亚洲视频| 精品国产一区二区三区久久| 激情成人在线视频| 欧美一区二区三区精品电影| 亚洲精品视频在线观看视频| 亚洲精品国产电影| 久久伊人91精品综合网站| 精品露脸国产偷人在视频| 在线观看国产成人av片| 色哟哟亚洲精品一区二区| 国产精品一区二区三区在线播放| 欧美成年人视频网站欧美| 欧美高清在线视频观看不卡| 在线视频日本亚洲性| 久久久免费在线观看| 精品一区二区亚洲| 成人久久精品视频| 亚洲国产精品va在看黑人| 精品国产自在精品国产浪潮| 欧洲美女7788成人免费视频| 日本最新高清不卡中文字幕| 97国产在线视频| 亚洲成人xxx| 色婷婷av一区二区三区久久| 成人免费网视频| 日韩免费观看高清| 91av中文字幕| 久久久精品一区二区三区| 日韩中文字幕在线免费观看| 日韩电影大片中文字幕| 日韩欧美在线视频观看| 国产中文欧美精品| 日韩视频在线一区| 国产精彩精品视频| 国产一区二区久久精品| 久久久久久久久中文字幕| 在线视频国产日韩| 国产成人啪精品视频免费网| 国产精品国模在线| 亚洲欧洲在线观看| 国产精品福利小视频| 久久精品国产电影| 亚洲精品资源在线| 国产丝袜一区视频在线观看| 亚洲激情视频在线观看| 91久久久久久久久久久久久| 亚洲视频777| 91精品国产精品| 91高清视频免费观看| 日韩欧美中文免费| 97av在线视频| 亚洲女人天堂成人av在线| 欧美第一淫aaasss性| 久久久久久美女| 日韩美女在线看| 国产精品va在线播放| 中文字幕亚洲专区| 久久国产精品电影| 国产精品久久久久久久天堂|