namespace BasicCode.AccountPermissionBLL.Attributes
{
[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method,AllowMultiple = true)]
public class ValidPermissionAttribute : Attribute
{
private readonly int _permissionNum;
public ValidPermissionAttribute(int permissionNum)
{
_permissionNum = permissionNum;
ValidAccountPermission();
}
///<summary>
/// 访问具体需要的权限
///</summary>
public int PermissionNum { get { return _permissionNum; } }
///<summary>
/// 当前用户的权限
///</summary>
public int CurrentUserPermissionNum { get; set; }
///<summary>
/// 验证当前用户权限是否满足所需要的权限
///</summary>
public void ValidAccountPermission()
{
if (PermissionNum != CurrentUserPermissionNum)
{
//TODO 如果两种权限不相等,则跳转至一个错误的页面Error.aspx
}
}
}
}
我用的.NET 4.0框架
可以这样做!
public void ValidAccountPermission()
{
if (PermissionNum != CurrentUserPermissionNum)
{
HttpContext.Current.Response.Redirect("Error.aspx");
}
}
HttpContext 是 namespace System.Web 的 class! 它封装了HTTP 请求的所有 HTTP 特定的信息!
需要你在BasicCode.AccountPermissionBLL项目中添加对System.Web的引用才能实现页面的跳转!
希望对你有帮助!
可以了,不报错了,但是将特性加到方法没起作用,没进特性,怎么打断点呢?还是我定义的方法有问题,需要一个相同名称的方法什么吗?
@Kamirin:
那时因为你CurrentUserPermissionNum 根本就没用,你可以用这种方式
[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method,AllowMultiple = true)]
public class ValidatePermissionAttribute : Attribute
{
private readonly int _permissionNum;
private int _currentUserPermissionNum;
public ValidatePermissionAttribute(int permissionNum, int currentPermissionNum)
{
this._permissionNum = permissionNum;
this._currentUserPermissionNum = currentPermissionNum;
ValidateAccountPermission();
}
public int PermissionNum
{
get
{
return this._permissionNum;
}
}
public int CurrentPermissionNum
{
get
{
return this._currentUserPermissionNum;
}
}
public void ValidateAccountPermission()
{
if (PermissionNum != CurrentPermissionNum)
{
HttpContext.Current.Response.Redirect("Error.aspx");
}
}
}
加断点可以调试的!
[ValidatePermission(1,10)]
protected void btnAddUser_Click(object sender, EventArgs e)
{
Response.Redirect("~/AddUser.aspx");
}
非常感谢您耐心的回答!但是,
这是在aspx后置文件的代码,当点击一个 新增用户 按钮的时候触发,
我的设想如果满足权限条件就跳入AddUser.aspx
不满足就在特性里判断直接跳入Error.aspx
明显权限一个为1,一个为10。不满足条件是会跳转至Error.aspx的
但问题是现在它根本就不进特性里面的去判断,打断点没用的,直接跳入AddUser.aspx页面
不知道怎么回事了
@Kamirin:
我明白你的意思! 你想把ValidatePermission当作一个过滤器一样,在方法执行前进行权限的过滤判断! 回头看看写的代码,其实最有意义的一段就是
if (PermissionNum != CurrentPermissionNum)
既然这样的话, 你完全可以采用代码量更小的公用方法来解决!
至于另外一个话题,你把特性加到类上, 加断点调试就可以了!
换个解决方式,一切都会变得简单不是么!
嗯。好的,再次感谢您的答复!我就提取一个公用方法来解决好了
那么,我最后一个问题,特性究竟该用在什么时候吗?
目前看来特性用在这里貌似是不合适的
期待你的答复,万分感谢你这几天不辞辛苦的答复了^_^
@Kamirin:
别客气, 共同学习!
这里有微软官方的解释: http://msdn.microsoft.com/zh-cn/library/z0w1kczw.aspx
我觉得我描述的不可能有它全面! 根据我的理解是特性不适合封装业务逻辑! 更深层次的知识可以了解一下"反射"这个话题!
特性说白了也就是在标注特性的属性上附加了一个特性对象,它本身不能影响被标注对象的行为,只能在对象行为中被执行。
希望能帮助到你。
感谢你的回复!但我还是个新人,您的回答对我来说有点抽象……就从这个例子来说的话,究竟用特性能否实现需求呢?若不能的话,那该用哪种解决方案来做到对权限的控制呢~~
@Kamirin:
我觉得特性非常好,特别在权限控制中使用非常方便。也没有找到成熟的办法,不如就照着这个思路做下去吧。另外就像楼上说的,我的意思就是你写在特性中的方法根本没有执行,因为特性不会自己执行自己的方法,必须你主动去调用。