AttributeTargets 枚举里面有一个值为 Assembly (可以对程序集应用属性),我想问的就是在代码里面怎么写才算是对程序集应用属性?
应该不是放在class上面或者方法、属性上面吧,命名空间前面也不能写特性啊!求教各位园友,我想实现的就是所有Controller 都能应用这个特性,而不是每个Controller都添加一遍,此处应该怎么写,还是说我理解错了这个Assembly 的意思,在线等,烦请园友们解答一下,不甚感激!
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false, Inherited = true)] public class PowerAttribute : ActionFilterAttribute { ........ }
[Power()] public class HomeController : Controller { ....... }
提示:
错误 11 特性“Power”对此声明类型无效。它只对“assembly”声明有效。
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false, Inherited = true)]
指明了这个attribute只能应用到assembly,就只能这样用。
你可以放到assemblyinfo文件里:[assembly: power]
也可以放在任何一个代码文件里,用法一样。
如果你希望把这个attribute应用到class,可以:
[AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
AttributeTargets有很多定义,都可以通过 或(|)操作运算符连接。
当一个attribute不指定AttributeUsage时,默认针对所有对象。
大神,我试了,我在AssemblyInfo中加入了[assembly:Power()]这段代码还是没起作用,我调试他也进不了我在Power里面打的断点。而且如果我指定AttributeTargets为Assembly的话,我写在类里面他也不起作用。
@晓菜鸟: 那是因为你的这个attribute不是为assembly准备的。
我让你加在assemblyinfo里是告诉你,你的attribute定义的usage是针对assembly的。
你要应用到HomeController类里,应该定义为AttributeTargets.Class,或者不定义Usage。
@519740105: 我想的是让这个UI项目下面的所有控制器都应用,所以我的Usage才定义为assembly,难道他说的这个“可以对程序集应用”不是我理解的加在程序集里面就能对程序集里面的所有.CS应用这个特性的意思?
@晓菜鸟: 如果你想让这个UI下的所有控制器都能应用,不是这样定义。
定义Assembly是说针对Assembly的特性定义,而不是应用到Assembly中的所有类。
要达到你的目的:
1、Attribute的Usage指向Class或不设置
2、在Application_Start事件里:
GlobalFilters.Add(new FilterAttribute());
@519740105: 嗯,先谢谢了,我先理解理解你说的话!
@519740105: 谢谢,功能实现了,非常感谢!完美的解决了我的问题!给你点赞!:)
代码:GlobalFilters.Filters.Add(new PowerAttribute());
你看下你的项目 AssemblyInfo.cs 文件中的 [assembly:xxxxx] 的定义。
大神,是说的这个吗?
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false, Inherited = true)] public class PowerAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { string loginName = filterContext.RequestContext.HttpContext.Request["loginName"]; if (string.IsNullOrEmpty(loginName)) { filterContext.Result = new RedirectResult("http://www.cnblogs.com/"); } base.OnActionExecuting(filterContext); } }
@晓菜鸟: 是说的这个,你只能在 AssemblyInfo.cs 中添加:
[assembly:Power()]
@Launcher: 大神,我试了,我在AssemblyInfo中加入了[assembly:Power()]这段代码还是没起作用,我调试他也进不了我在Power里打的断点。
@Launcher: 谢谢大神,问题已经解决了,非常感谢!:)