以下仅供参考,本人也是刚接触.net MVC,菜鸟一枚。。。
大致代码逻辑:
control层:
[YourAttrName(YourParams...)]
public ActionResult YourControlName(){}
特性类定义:
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class , AllowMultiple = false,Inherited = true)]
public class YourAttrNameAtrribute : FilterAttribute , IAuthorizationFilter{
public void OnAuthorization(AuthorizationContext filterContext){}
public YourAttrNameAttribute(YourParams...)
{}
}
给每一个请求的action操作加上 YourAttrName 特性,通过 YourAttrName特性 的参数将当前action请求的所属模块传递给特性处理函数
特性: 特性(attribute)是被指定给某一声明的一则附加的声明性信息。 在我的理解里 自定义特性有点像定义另类的类,就是要给他加上了[AttributeUasage(AttributeTargets.Method)]这一特性,而给别的meth||class加上自定义特性有点像实例化特性类("[]"内的内容就是调用特性的构造函数传入的对象必须为static的,不知道为什么),在使用自定义类时,可以不加Attrbute后缀,这有点类似于MVC中url路径中controller后缀可以省略,MVC内部进行了处理。
在这里我们使用的自定义特性继承了FilterAttribute类和IAuthorizationFilter接口(C#不支持多继承),继承FilterAttribute是因为此类为过滤器特性,他的实例可以在被修饰的method,class前实例化(猜测,不保证正确性)这样我们就可以在controller相应用户请求前,先验证下当前请求用户是否有权限访问请求的操作,可以将用户此时请求的模块信息通过特性参数或者session传入给特性实例。
以上我们实现了在响应用户请求前,通过特性先进行一些操作以判断用户是否有访问的权限,那么接下来如果用户没权限该怎么中断action的请求或者说该怎么略过这次controller响应,这里可以通过特性继承IAuthorizationFilter接口类实现,IAuthorizationFilter有一个必须实现的方法public void OnAuthorization(AuthorizationContext filterContext),这个方法的传入参数filterContext拥有属性Result,他的类型为ActionResult(默认值为null),如果他的值不为null则会向视图层返回他的值,并不调用用户请求的controller。参数filterContext拥有属性controller(类型为ControllerBase),filterContext.Controller存储他的子类了当前请求环境的controller实例,可通过类型转换的方式取得当前controller实例,(filterContext.Controller as Controller).Session["XXX"]通过这种方式我们可以获取到想要的session值(如果需要)