zoukankan      html  css  js  c++  java
  • 超级简单:巧用ViewState属性

    Demo:/Files/zhuqil/WebApplication4.rar

    当我在页面中使用ViewState ,通常是用一个属性表示,例如:

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

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

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

    或者

    [ViewStateProperty]
    protected int ViewState_UserID { getset;}

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

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

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

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

    代码
    [AttributeUsage(AttributeTargets.Property)]
    public class ViewStateProperty : Attribute
    {
        
    public string ViewStateName { getprivate set; }

        
    internal ViewStateProperty(){
            
    this.ViewStateName = string.Empty;
        }

        
    public ViewStateProperty(string in_ViewStateName){
            
    this.ViewStateName = in_ViewStateName;
        }
    }

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

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

    代码
    private PropertyInfo[] ViewStateProperties;
    protected BasePage() 
    {
        
    this.ViewStateProperties = GetType().GetProperties(
          BindingFlags.NonPublic 
    | BindingFlags.Instance).Where(
          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方法

    代码
    protected override void LoadViewState(object savedState)
    {
        
    base.LoadViewState(savedState);
        
    foreach (PropertyInfo property in ViewStateProperties)
        {
            ViewStateProperty[] attributes 
    = (ViewStateProperty[])
              property.GetCustomAttributes(
    typeof(ViewStateProperty), false);
            var LocalName 
    = (string.Empty == attributes[0].ViewStateName) ? 
               property.Name : attributes[
    0].ViewStateName;
            
    if (ViewState[LocalName] != null)
                property.SetValue(
    this, ViewState[LocalName], null);
        }
    }

    protected override object SaveViewState()
    {
        
    foreach (PropertyInfo property in ViewStateProperties)
        {
            ViewStateProperty[] attributes 
    = (ViewStateProperty[])
              property.GetCustomAttributes(
    typeof(ViewStateProperty), false);
            var LocalName 
    = (string.Empty == attributes[0].ViewStateName)? 
              property.Name:attributes[
    0].ViewStateName;
            ViewState[LocalName] 
    = property.GetValue(thisnull);
        }
        
    return base.SaveViewState();
    }

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

    使用它:

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

     或者:

    [ViewStateProperty]
    protected int ViewState_UserID { getset;}

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

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

    参考原文:http://www.codeproject.com/KB/viewstate/ViewStateAttribute.aspx



    (全文完)


    以下为广告部分

    您部署的HTTPS网站安全吗?

    如果您想看下您的网站HTTPS部署的是否安全,花1分钟时间来 myssl.com 检测以下吧。让您的HTTPS网站变得更安全!

    SSL检测评估

    快速了解HTTPS网站安全情况。

    安全评级(A+、A、A-...)、行业合规检测、证书信息查看、证书链信息以及补完、服务器套件信息、证书兼容性检测等。

    SSL证书工具

    安装部署SSL证书变得更方便。

    SSL证书内容查看、SSL证书格式转换、CSR在线生成、SSL私钥加解密、CAA检测等。

    SSL漏洞检测

    让服务器远离SSL证书漏洞侵扰

    TLS ROBOT漏洞检测、心血漏洞检测、FREAK Attack漏洞检测、SSL Poodle漏洞检测、CCS注入漏洞检测。

    作者:朱祁林 出处:http://zhuqil.cnblogs.com 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。  
  • 相关阅读:
    Redis的安装和部署
    SaltStack应用grains和jinja模板-第四篇
    SaltStack部署配置Tomcat-第三篇
    python魔法方法、构造函数、序列与映射、迭代器、生成器
    python异常
    python类
    python之函数、参数、作用域、递归
    docker+openvswitch实现主机与容器的网络通信
    Docker网络和容器的通信
    docker命名空间、控制组及联合文件系统概念
  • 原文地址:https://www.cnblogs.com/zhuqil/p/ViewStateAttribute.html
Copyright © 2011-2022 走看看