如何创建默认的ActionFilter(OnActionExecuting)并使用属性覆盖

时间:2013-05-04 02:43:50

标签: asp.net-mvc asp.net-mvc-4

使用ASP.NET MVC4我想创建一个动作过滤器属性,如:

 public class ForceHttps : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {...

我想要的是将该属性分配给我想要https的控制器,而对于所有其他控制器,我想要另一个强制Http的OnActionExecuting。我可以使用[ForceNoHttps]来装饰其他所有控制器,这样可以工作,但我的偏好是默认为[ForceNoHttps]并且只有当我指定[ForceHttps]时才会执行此方法而不执行另一个。

所以,我希望它执行一个或另一个,而不是两个。也就是说,

如果{[ForceHttps]在控制器上}   强制页面为https 其他   强制页面为http

有意义吗?我可以这样做吗?

由于

1 个答案:

答案 0 :(得分:1)

我认为你想要的是这样的:

public class NotHttpsAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (request.IsSecureConnection)
        {
            string redirectUrl = filterContext.HttpContext.
                 Request.Url.ToString().Replace("https:", "http:");
            filterContext.HttpContext.Response.Redirect(redirectUrl);
        }
        base.OnActionExecuting(filterContext);
    }
}

此处的问题是您必须将此过滤器应用于非https

的每个Controller / Action

减轻编程负担的方法是注册你的负担是通过在global.asax中注册NotHttps到全局过滤器。

public static void RegisterGlobalFilters(GlobalFilterCollection filters) {
    filters.Add(new NotHttpsAttribute()  { Order = 0 });
}