首页 新闻 搜索 专区 学院

【C#】请问,如何在自定义的特性里控制页面的跳转呀??

0
悬赏园豆:50 [已解决问题] 解决于 2011-09-28 07:35
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框架

Kamirin的主页 Kamirin | 初学一级 | 园豆:156
提问于:2011-09-25 00:29
< >
分享
最佳答案
0

可以这样做!

public void ValidAccountPermission()
{
if (PermissionNum != CurrentUserPermissionNum)
{
HttpContext.Current.Response.Redirect("Error.aspx");
}
}

HttpContext 是 namespace System.Web 的 class! 它封装了HTTP 请求的所有 HTTP 特定的信息!

需要你在BasicCode.AccountPermissionBLL项目中添加对System.Web的引用才能实现页面的跳转!

希望对你有帮助!

收获园豆:50
Chenkun | 小虾三级 |园豆:806 | 2011-09-25 14:10

可以了,不报错了,但是将特性加到方法没起作用,没进特性,怎么打断点呢?还是我定义的方法有问题,需要一个相同名称的方法什么吗?

Kamirin | 园豆:156 (初学一级) | 2011-09-25 17:41

@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");
}
}

}

加断点可以调试的!

Chenkun | 园豆:806 (小虾三级) | 2011-09-25 21:24
    [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 | 园豆:156 (初学一级) | 2011-09-26 18:49

@Kamirin:

我明白你的意思! 你想把ValidatePermission当作一个过滤器一样,在方法执行前进行权限的过滤判断! 回头看看写的代码,其实最有意义的一段就是

if (PermissionNum != CurrentPermissionNum)

既然这样的话, 你完全可以采用代码量更小的公用方法来解决!

至于另外一个话题,你把特性加到类上, 加断点调试就可以了!

换个解决方式,一切都会变得简单不是么!

Chenkun | 园豆:806 (小虾三级) | 2011-09-27 13:19

嗯。好的,再次感谢您的答复!我就提取一个公用方法来解决好了

那么,我最后一个问题,特性究竟该用在什么时候吗?

目前看来特性用在这里貌似是不合适的

 

期待你的答复,万分感谢你这几天不辞辛苦的答复了^_^

Kamirin | 园豆:156 (初学一级) | 2011-09-27 19:00

@Kamirin:

别客气, 共同学习!

这里有微软官方的解释: http://msdn.microsoft.com/zh-cn/library/z0w1kczw.aspx

我觉得我描述的不可能有它全面! 根据我的理解是特性不适合封装业务逻辑! 更深层次的知识可以了解一下"反射"这个话题!

Chenkun | 园豆:806 (小虾三级) | 2011-09-27 21:02
其他回答(1)
0

特性说白了也就是在标注特性的属性上附加了一个特性对象,它本身不能影响被标注对象的行为,只能在对象行为中被执行。

希望能帮助到你。

today4king | 园豆:3299 (老鸟四级) | 2011-09-25 10:24

感谢你的回复!但我还是个新人,您的回答对我来说有点抽象……就从这个例子来说的话,究竟用特性能否实现需求呢?若不能的话,那该用哪种解决方案来做到对权限的控制呢~~

支持(0) 反对(0) Kamirin | 园豆:156 (初学一级) | 2011-09-25 10:56

@Kamirin:

我觉得特性非常好,特别在权限控制中使用非常方便。也没有找到成熟的办法,不如就照着这个思路做下去吧。另外就像楼上说的,我的意思就是你写在特性中的方法根本没有执行,因为特性不会自己执行自己的方法,必须你主动去调用。

支持(0) 反对(0) today4king | 园豆:3299 (老鸟四级) | 2011-10-05 17:40
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册