前言html
最近作權限控制,對頁面的權限控制使用IHttpModule作的,想把控制粒度細化到頁面上控件的權限判斷,意圖是傳入控件編號,根據控件編號和當前用戶的權限,若是沒有權限的話就把控件隱藏或顯示爲不可用,打算用Attribute來作,如下是遇到的一些問題和見解,雖然失敗了可是以爲仍然有參考價值。編程
推薦幾篇文章:數組
1. Attribute在.net編程中的應用(一) ide
2. Attribute在.net編程中的應用(二) spa
3. Attribute在.NET編程中的應用(三) .net
4. Attribute在.NET編程中的應用(四) code
5. CLR筆記:17.自定義屬性 htm
正文:blog
先看個人錯誤代碼:ip
[AttributeUsage(AttributeTargets.Class
|
AttributeTargets.Field
|
AttributeTargets.Method)]
public
class
PowerAttribute : Attribute
{
///
<summary>
///
對頁面內控件進行權限判斷,權限的字符串組成:URL+"?id"+Control.ID
///
例如:/page/index?id=tbName
///
</summary>
///
<param name="pType"></param>
///
<param name="control"></param>
public
PowerAttribute(PowerType pType,
params
WebControl[] control)
{
for
(
int
i
=
control.Length;
--
i
>=
0
; )
{
WebControl Control
=
control.GetValue(i)
as
WebControl;
if
(Control
!=
null
)
if
(HasPower(
string
.Concat(WebHelper.WebRequest.Path,
"
?id=
"
, Control.ID))
==
-
1
)
//
判斷權限
if
(pType
==
PowerType.Visible)
Control.Visible
=
false
;
else
Control.Enabled
=
false
;
}
}
public
int
HasPower(
string
path)
{
return
-
1
;
}
///
<summary>
///
得到控件的權限,1 具備權限,0 用戶超時,-1 沒有權限
///
</summary>
///
<param name="control"></param>
///
<param name="Field"></param>
public
PowerAttribute(WebControl control,
ref
int
Field)
{
Field
=
HasPower(
string
.Concat(WebHelper.WebRequest.Path,
"
?id=
"
, control.ID));
}
///
<summary>
///
得到頁面的權限,1 具備權限,0 用戶超時,-1 沒有權限
///
</summary>
///
<param name="control"></param>
///
<param name="Field"></param>
public
PowerAttribute(
ref
int
Field)
{
Field
=
HasPower(WebHelper.WebRequest.Path);
}
}
意圖比較明顯,想在要控制控件權限的頁面裏面加一個Attribute標記傳入控件編號就能自動把其設置爲指定的顯示狀態,但是失敗了!如下是錯誤信息:
屬性參數必須是常量表達式、typeof 表達式或數組建立表達式 ConsoleTest
也就是說無法傳,也不可以用ref來傳遞引用!也就是說沒有辦法直接改變頁面上的控件或字段的值,這讓我突然想起了DefaultValueAttribute,MSDN的解釋是
指定屬性 (Property) 的默認值。我發現有許多朋友有點誤會這個,先看代碼:
static
void
Main(
string
[] args)
{
AttributeCollection attributes
=
TypeDescriptor.GetProperties(
new
MyClass())[
"
MyProperty
"
].Attributes;
/*
Prints the default value by retrieving the DefaultValueAttribute
* from the AttributeCollection.
*/
DefaultValueAttribute myAttribute
=
(DefaultValueAttribute)attributes[
typeof
(DefaultValueAttribute)];
Console.WriteLine(
"
The default value is:
"
+
myAttribute.Value.ToString());
Console.Read();
}
class
MyClass
{
private
bool
myVal
=
false
;
[DefaultValue(
false
)]
public
bool
MyProperty
{
get
{
return
myVal;
}
set
{
myVal
=
value;
}
}
}
這是MSDN例子,注意看兩點:
1. DefaultValue傳入參數爲false,而myVal設置的也是false
2. 再看調用的地方,是使用的DefaultValueAttribute,而不是直接訪問的屬性MyProperty
狐疑了吧,他設置的默認值不是屬性MyProperty的默認值!!不信的話你能夠把[DefaultValue(false)]改爲[DefaultValue(true)],而後直接Console.WriteLine(new MyClass().MyProperty);!!
從上面參考的幾篇文章中能夠發現,Attribute能夠作方法參數校驗、也能夠爲過期的方法作標記 ObsoleteAttribute、爲方法傳參,雖然如此,可是仍然覺的使用起來並不方便,只是看起來比較酷罷了,一個類竟然能夠這樣使用!!能夠把這個類僅僅使用在類、方法、字段上,也可使用因此地方,控制使用次數,顯然仍然是有他的用處的,無法把你的代碼和他耦合起來,也是用反射來實現相關功能的!!
說到這裏實在仍是不太明白,可是起碼知道DefaultValueAttribute不是爲當前類設置默認值的,因此使用的時候注意Attribute概念問題!歡迎你們提意見: )