我们可以在其中覆盖.NET基类库方法



我需要覆盖基类的默认功能才能实现一些自定义行为。例如,我需要在MVC4应用程序中处理未经授权的请求。我搜索并找到了一些答案,这些答案是授权tribute类的默认方法,如下:

默认basse类:

public class AuthorizeAttribute : FilterAttribute, IAuthorizationFilter
{
    public AuthorizeAttribute();
    public string Roles { get; set; }
    public override object TypeId { get; }
    public string Users { get; set; }
    protected virtual bool AuthorizeCore(HttpContextBase httpContext);
    protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext);
    public virtual void OnAuthorization(AuthorizationContext filterContext);
    protected virtual HttpValidationStatus OnCacheAuthorization(HttpContextBase httpContext);
}

覆盖handernauthorizedRequest:

public class CustomAuthorizationAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        // You need to set this action result to something other than a HttpUnauthorizedResult, 
        // this result will cause the redirection to the login page
        // Forbidden request... does not redirect to login page
        // filterContext.Result = new HttpStatusCodeResult(403);
        filterContext.Result = new ErrorActionResult { ErrorMessage = "Unauthorized Access" };
    }
}

,但是我有几个问题,在使用此功能之前,我想解释一下。我知道这些是非常基本的问题,但仍然对此有一些困惑。

问题:

  1. 我们可以在哪里过度过度级别的方法,这意味着我需要添加一个新的C#类文件,然后覆盖BCl方法?

  2. 如果我覆盖,那么我必须在使用[授权]签名的所有方法上使用[customAuthorization]签名。有什么办法可以超过thandunauthorizedRequest的默认功能,而无需进行任何签名更改?

  3. 如果我们必须覆盖某些默认的BCl方法的功能,而某些特定页面liek .toString()则应该在该类本身中覆盖这些BCL方法。它正确吗?

任何答案或建议将不胜感激。谢谢。

q1。是

Q2。是,否。通常,要使用子类,您必须将其显式,即用子类属性替换所有现有属性。

但是,MVC是特定的,因为它已经设计了,因此它允许您挂接许多内部设备。特别是,可以自定义内部解析器,即创建基础架构元素时称为。

看这个教程

http://www.asp.net/mvc/tutorials/hands-on-labs/aspnet-mvc-4-dependency-indoction #envistion#Escise3

首先,他们设置了一个自定义依赖项解析器(IDependencyResolver)。MVC每次需要一些东西都会调用解析器。当要使用过滤器时,MVC向解析器询问IFilterProvider。然后,提供商负责创建过滤器。这是您的自定义过滤器提供商可以很聪明的地方,并返回您的继承的类实例而不是基类实例。

尽管从技术上讲,问题仍然存在 - 它是否足够干净且可以理解?由于解析器在外部配置为控制器/操作,因此仅查看控制器和操作代码不会揭示提供商替代过滤器。这听起来不好,迟早有人可能会因为这种困惑而犯一个重大错误。然后,建议将其显式 - 以明确的方式使用子类过滤器。

Q3。是

gerry。关于覆盖基类方法,只有在将方法标记为虚拟时,才能这样做。是的,您需要从基类继承,并根据需要覆盖虚拟方法。您可以使用"新"关键字来隐藏非虚拟方法。另外,标记为密封的类,不能继承。

是的,您将需要创建一个自定义验证属性,并更改所有用法,尽管另一种选择是将其注册为全局过滤器,但是然后将其应用于您可能不想要的每个操作。

您是正确的,如果您想覆盖.tostring()之类的东西,那么您就可以做孩子/继承类。

我认为您的大多数问题都归结为:

我可以在.net中猴子点吗?

答案简单地"否"。您必须使用已知和发布的扩展点。有时这意味着子类中的override;有时,这意味着更改一些提供商(通常是实现接口),有时意味着挂接事件。有时,您只是无法做到(尽管在MVC4的具体示例中,即使没有扩展点,您也只能分配源代码本身并重新编译)。

最新更新