• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > asp.net实现非常实用的自定义页面基类(附源码)

asp.net实现非常实用的自定义页面基类(附源码)

作者:Jeff Wong 字体:[增加 减小] 来源:互联网 时间:2017-05-11

Jeff Wong通过本文主要向大家介绍了页面跳转 asp.net,阐述asp.net页面模型,51asp.net源码,网站源码 asp.net,论坛源码 asp.net等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

本文实例讲述了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();
        }
   



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • ASP.NET使用ajax实现分页局部刷新页面功能
  • ASP.NET实现个人信息注册页面并跳转显示
  • Asp.net中阻止页面按钮多次提交的解决办法
  • 在ASP.NET Core中显示自定义的错误页面
  • ASP.NET实现个人信息注册页面并跳转显示
  • ASP.NET页面缓存常见的4种方式
  • Asp.net页面中调用soapheader进行验证的操作步骤
  • ASP.NET中防止页面刷新造成表单重复提交执行两次操作
  • asp.net采集页面上所有图像图片资源的具体方法
  • 详解ASP.NET页面生命周期

相关文章

  • 2017-05-11asp.net中Session缓存与Cache缓存的区别分析
  • 2017-05-11asp.net保存网上图片到服务器的实例
  • 2017-05-11.NET中RDLC循环处理数据的应用分析
  • 2017-05-11ASP.NET中实现导出ppt文件数据的实例分享
  • 2017-05-11IIS7中ASP.net 请求处理过程说明
  • 2017-05-11C#Web应用程序入门经典学习笔记之一
  • 2018-08-20.Net 实现图片缩略图上传通用方法
  • 2018-08-20.Net Core Cors中间件的深入讲解
  • 2017-05-11EasyUI Tree+Asp.net实现权限树或目录树导航的简单实例
  • 2017-05-11Asp.net获取当前目录的方法小结

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • ASP遗留的二十大积习
    • C# 文件保存到数据库中或者从数据库中读取文件
    • ASP.NET数据绑定GridView控件使用技巧
    • Asp.net调试的一些问题小结
    • 限制CheckBoxList控件只能单选实现代码及演示动画
    • asp.net 退出登陆(解决退出后点击浏览器后退问题仍然可回到页面问题)
    • .NET使用js制作百度搜索下拉提示效果(不是局部刷新)实现思路
    • 浅谈ASP.NET MVC应用程序的安全性
    • ToString()使用方法汇总(c#)
    • asp.net基于Calendar实现blog日历功能示例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有