asp.net MVC 3/4 equivalent to a response.filter

后端 未结 2 990
耶瑟儿~
耶瑟儿~ 2020-12-06 08:10

I am in a need to intercept all of the html that will be sent to the browser and replace some tags that are there. this will need to be done globally and for every view. wha

2条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-06 08:25

    You could still use a response filter in ASP.NET MVC:

    public class ReplaceTagsFilter : MemoryStream
    {
        private readonly Stream _response;
        public ReplaceTagsFilter(Stream response)
        {
            _response = response;
        }
    
        public override void Write(byte[] buffer, int offset, int count)
        {
            var html = Encoding.UTF8.GetString(buffer);
            html = ReplaceTags(html);
            buffer = Encoding.UTF8.GetBytes(html);
            _response.Write(buffer, offset, buffer.Length);
        }
    
        private string ReplaceTags(string html)
        {
            // TODO: go ahead and implement the filtering logic
            throw new NotImplementedException();
        }
    }
    

    and then write a custom action filter which will register the response filter:

    public class ReplaceTagsAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var response = filterContext.HttpContext.Response;
            response.Filter = new ReplaceTagsFilter(response.Filter);
        }
    }
    

    and now all that's left is decorate the controllers/actions that you want to be applied this filter:

    [ReplaceTags]
    public ActionResult Index()
    {
        return View();
    }
    

    or register it as a global action filter in Global.asax if you want to apply to all actions.

提交回复
热议问题