如以下内容,我在项目默认名称空间中创建了一个AuthorizeAttribute
类。因此,编译器将自动拾取它,而不是MVC的标准标准。但是它选择了System.Web.Mvc.Authorizeattribute
。
如果我包括我的项目名称空间,即using TestIdentitySample;
,则显示以下错误
'Authorize' is an ambiguous reference between 'System.Web.Mvc.Authorizeattribute' and 'ProjectDefaultNamespace'
- 请注意,我不想使用完全合格的名称或命名空间别名或其他Custome属性名称。
我的授权tribute类
namespace TestIdentitySample
{
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class AuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(System.Web.Mvc.AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAuthenticated)
{
filterContext.Result = new System.Web.Mvc.HttpStatusCodeResult((int)System.Net.HttpStatusCode.Forbidden);
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}
}
}
}
我只希望编译器会自动拾取它,而不是MVC的标准,如果可能的话。预先感谢您的任何帮助。
您应该重新考虑使用相同名称创建自己的属性的方法。这是有问题的,原因有两个:
- 代码的读者可能认为这是内置属性,而不是您自己的属性。他们可能会误解您的代码的作用。这对于
AuthorizeAttribute
尤其重要,因为安全是Web应用程序中通常的关键问题 - 您可能会遇到命名冲突。这正是这里发生的一切。
您可以以不同的方式解决您的问题:
重命名您的属性
一个很好的解决方案 - 我建议的解决方案就是简单地重命名您的自定义属性,以便很明显它是您的,命名冲突得到解决。
明确指定名称空间
如果要保留属性的相同名称,则可以通过明确指定自己的名称空间来解决命名冲突:
[ProjectDefaultNamespace.Authorize]
使用名称空间别名
您还可以在using
列表中指定名称空间别名:
using MyAuthorizeAttribute = ProjectDefaultNamespace.AuthorizeAttribute;
然后像以下方式应用:
[MyAuthorizeAttribute]
但是,再说一次,为什么不只是给它自己的自定义名称呢?它将在代码中看起来相同,而没有别名的其他并发症。