A way to exclude action filters in ASP.NET MVC?

前端 未结 2 883
一生所求
一生所求 2020-12-23 18:41

I\'ve run into several cases in ASP.NET MVC where I wanted to apply an action filter on every action except one or two. For example, say you have an AccountController. Eve

相关标签:
2条回答
  • 2020-12-23 19:12

    I prefer the solution outlined here. Though it's not as generic a solution as yours, I found it a bit more straightforward.

    In my case, I was looking for a way to enable a CompressionFilter on everything but a few items. So I created an empty attribute like this:

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
    public sealed class DisableCompression : Attribute { }
    

    Then in the main attribute, check for the presence of the attribute like so:

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
    public class CompressionFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            bool disabled = filterContext.ActionDescriptor.IsDefined(typeof(DisableCompression), true) ||
                            filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(DisableCompression), true);
            if (disabled)
                return;
    
            // action filter logic here...
        }
    }
    

    Though the page I linked to mentions that this is for MVC 3, it seems to work well enough way back in MVC 1 as well.

    EDIT: showing some usage here in response to comments. Before I made the changes above, it looked exactly like this, except without the [DisableCompression] attribute flagging the method I wanted to exclude. There's no other refactoring involved.

    [CompressionFilter]
    public abstract class BaseController : Controller
    {
    }
    
    public class SomeController : BaseController
    {
        public ActionResult WantThisActionCompressed()
        {
            // code
        }
    
        [DisableCompression]
        public ActionResult DontWantThisActionCompressed()
        {
            // code
        }
    }
    
    0 讨论(0)
  • 2020-12-23 19:18

    I assume for years ago that the [AllowAnnonymous] attribute hadn't been added to ASP.NET MVC. Today I can have the [Authorize] attribute on top of my controller applying to all the Action methods and I just simply override this in Actions I require unauthorized users by adding the [AllowAnonymous] attributes to the specific actions.

    0 讨论(0)
提交回复
热议问题