使用ActionFilters在MVC中缩小HTML时,为什么使用“OnActionExecuting”而不是“OnActionExected”

时间:2017-10-11 10:33:03

标签: asp.net-mvc

我正在尝试通过参考这篇文章来实现HTML缩小:https://arranmaclean.wordpress.com/2010/08/10/minify-html-with-net-mvc-actionfilter/

public class WhitespaceFilterAttribute : ActionFilterAttribute
{

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {

        var request = filterContext.HttpContext.Request;
        var response = filterContext.HttpContext.Response;

        response.Filter = new WhiteSpaceFilter(response.Filter, s =>
        {
            s = Regex.Replace(s, @"\s+", " ");
            s = Regex.Replace(s, @"\s*\n\s*", "\n");
            s = Regex.Replace(s, @"\s*\>\s*\<\s*", "><");
            s = Regex.Replace(s, @"<!--(.*?)-->", "");   //Remove comments

            // single-line doctype must be preserved 
            var firstEndBracketPosition = s.IndexOf(">");
            if (firstEndBracketPosition >= 0)
            {
                s = s.Remove(firstEndBracketPosition, 1);
                s = s.Insert(firstEndBracketPosition, ">");
            }
            return s;
        });

    }
}

为什么作者使用OnActionExecuting而不是OnActionExected? 我们知道OnActionExecuting在操作之前执行,OnActionExected在操作之后执行。如果我将其更改为OnActionExected那么那会有用吗?

1 个答案:

答案 0 :(得分:0)

这是在MVC中使用过滤器的正确方法。过滤器的目的是执行逻辑以过滤掉某些请求执行特定操作。过滤器实际上并不执行操作(或者至少它不应该执行)。相反,它会设置一个处理程序(通常为filterContext.Result,但在这种情况下为response.Filter)。

MVC框架负责执行操作。这是在请求生命周期的稍后时间点完成的,而不是在设置时。

回答问题

  

为什么作者使用OnActionExecuting而不是OnActionExected?

在操作完成后

OnActionExecuted触发。在该点设置过滤器在请求生命周期中为时已晚,以使其产生任何影响。