我正在尝试通过参考这篇文章来实现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
那么那会有用吗?
答案 0 :(得分:0)
这是在MVC中使用过滤器的正确方法。过滤器的目的是执行逻辑以过滤掉某些请求执行特定操作。过滤器实际上并不执行操作(或者至少它不应该执行)。相反,它会设置一个处理程序(通常为filterContext.Result
,但在这种情况下为response.Filter
)。
MVC框架负责执行操作。这是在请求生命周期的稍后时间点完成的,而不是在设置时。
回答问题
在操作完成后为什么作者使用OnActionExecuting而不是OnActionExected?
OnActionExecuted
触发。在该点设置过滤器在请求生命周期中为时已晚,以使其产生任何影响。