网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 设计资源 > .Net编程 > 正文

巧用ViewState属性【附示例代码】

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务

示例代码下载】当我们在页面中使用ViewState ,通常是用一个属性表示,例如:

  1. private int ViewState_UserID 
  2.     get { return (int) ViewState["UserId"]; } 
  3.     set { ViewState["UserId"] = value; } 

写这样一组代码感觉比较麻烦,如果能像下面这样简单地使用就好了。

  1. [ViewStateProperty("UserID")] 
  2. protected int ViewState_UserID { getset;} 

或者

  1. [ViewStateProperty] 
  2. protected int ViewState_UserID { getset;} 

这里介绍一种超级简单的方式去实现:使用Attribute。

第一步:创建BasePage 类,它继承System.Web.UI.Page。这里使用了Reflection和LINQ。

  1. using System.Reflection; 
  2. using System.Linq; 
  3. public class BasePage : System.Web.UI.Page 

第二步:在BasePage中使用一个内部类ViewStateProperty ,这个类继承Attribute 。用Attribute的目的是描述页面中哪个属性是viewstate属性。用这个属性来标识viewstate属性,因此它应该BasePage内部。 

  1. [AttributeUsage(AttributeTargets.Property)] 
  2. public class ViewStateProperty : Attribute 
  3.     public string ViewStateName { getprivate set; } 
  4.  
  5.     internal ViewStateProperty(){ 
  6.         this.ViewStateName = string.Empty; 
  7.     } 
  8.  
  9.     public ViewStateProperty(string in_ViewStateName){ 
  10.         this.ViewStateName = in_ViewStateName; 
  11.     } 

[AttributeUsage(AttributeTargets.Property)]意味着这个attribute 只对property类型可用。在public ViewStateProperty(string in_ViewStateName)中初始化ViewState 的名称。默认情况下,ViewState 的名字为空。如果你想在设置attribute的时候初始化ViewState的名字时,要将默认构造函数设置为私有的。

第三步:在BasePage中,创建一个ViewStateProperties变量来存储有ViewStateProperty标签的属性,在BasePage默认构造函数中初始化它们:

  1. private PropertyInfo ViewStateProperties; 
  2. protected BasePage()  
  3.     this.ViewStateProperties = GetType().GetProperties( 
  4.       BindingFlags.NonPublic | BindingFlags.Instance).Where( 
  5.       p => p.GetCustomAttributes(typeof(ViewStateProperty), true).Length > 0).ToArray(); 

GetType().GetProperties(BindingFlags.NonPublic | BindingFlags.Instance)通过反射获得所有的public 和protected属性 。Where(p=>p.GetCustomAttributes(typeof(ViewStateProperty), true).Length > 0)用来过滤有ViewStateProperty修饰的属性。

第四步: 在BasePage中重载LoadViewState 和SaveViewState方法

  1. protected override void LoadViewState(object savedState) 
  2.     base.LoadViewState(savedState); 
  3.     foreach (PropertyInfo property in ViewStateProperties) 
  4.     { 
  5.         ViewStateProperty attributes = (ViewStateProperty) 
  6.           property.GetCustomAttributes(typeof(ViewStateProperty), false); 
  7.         var LocalName = (string.Empty == attributes[0].ViewStateName) ?  
  8.            property.Name : attributes[0].ViewStateName; 
  9.         if (ViewState[LocalName] != null
  10.             property.SetValue(this, ViewState[LocalName], null); 
  11.     } 
  12.  
  13. protected override object SaveViewState() 
  14.     foreach (PropertyInfo property in ViewStateProperties) 
  15.     { 
  16.         ViewStateProperty attributes = (ViewStateProperty) 
  17.           property.GetCustomAttributes(typeof(ViewStateProperty), false); 
  18.         var LocalName = (string.Empty == attributes[0].ViewStateName)?  
  19.           property.Name:attributes[0].ViewStateName; 
  20.         ViewState[LocalName] = property.GetValue(thisnull); 
  21.     } 
  22.     return base.SaveViewState(); 

目的是根据name设置viewstate值,这个name设置在ViewStateProperty标签上,加载ViewState的值,并赋值给有ViewStateProperty修饰的属性

使用它:

  1. [ViewStateProperty("UserID")] 
  2. protected int ViewState_UserID { getset;} 

或者:

  1. [ViewStateProperty] 
  2. protected int ViewState_UserID { getset;} 

在第一个,设置一个名为UserID的ViewState,第二个,您设置名为ViewState_UserID的ViewState。

注意:要实现这样的属性,您不能将它们设置为私有的,因为 GetType().GetProperties(BindingFlags.NonPublic | BindingFlags.Instance) 不能返回private 属性,设置为protected足以满足我们的需要。

设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师