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