超级简单:巧用ViewState属性

巧用ViewState属性
强烈推介IDEA2021.1.3破解激活,IntelliJ IDEA 注册码,2021.1.3IDEA 激活码  

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 { 
get

set
;}

或者

[ViewStateProperty]

protected
 
int
 ViewState_UserID { 
get

set
;}

这里介绍一种超级简单的方式去实现:使用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内部。 

超级简单:巧用ViewState属性
超级简单:巧用ViewState属性
代码

[AttributeUsage(AttributeTargets.Property)]

public
 
class
 ViewStateProperty : Attribute
{
    

public
 
string
 ViewStateName { 
get

private
 
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默认构造函数中初始化它们:

 

超级简单:巧用ViewState属性
超级简单:巧用ViewState属性
代码

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方法

超级简单:巧用ViewState属性
超级简单:巧用ViewState属性
代码

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(
this

null
);
    }
    

return
 
base
.SaveViewState();
}

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

使用它:

 

[ViewStateProperty(
"
UserID
"
)]

protected
 
int
 ViewState_UserID { 
get

set
;}

 或者:

[ViewStateProperty]

protected
 
int
 ViewState_UserID { 
get

set
;}

在第一个,设置一个名为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网站变得更安全!

超级简单:巧用ViewState属性

SSL检测评估

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

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

SSL证书工具

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

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

SSL漏洞检测

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

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

架构君码字不易,如需转载,请注明出处:https://javajgs.com/archives/42118
0

发表评论