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

2019-05-22 21:58:34于海丽

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