asp.net MVC 3/4相当于response.filter(asp.net MVC 3/4

2019-06-24 11:11发布

我是一个需要拦截所有将要发送到浏览器的HTML和替换一些标签是在那里。 这将需要在全球范围内,并为每个视图完成。 什么是3或4使用C#为此在ASP.NET MVC的最佳方法是什么? 在过去,我在ASP.net Web表单使用在Global.asax(VB)的“response.filter”做到了这一点

Private Sub Global_PreRequestHandlerExecute(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.PreRequestHandlerExecute
    Response.Filter = New ReplaceTags(Response.Filter)
End Sub

这就要求一类我创建了一个从system.io.stream继承和通过HTML走到全部更换标签。 我不知道对如何使用C#为此在ASP.NET MVC 4。 正如你可能已经注意到我是一个在世界MVC完全newbee。

Answer 1:

你仍然可以使用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();
    }
}

然后写自定义动作滤波器,其将注册响应滤波器:

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

现在所有剩下的就是装修控制器/要应用此过滤器的操作:

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

或者,如果你想申请的所有行动将其注册为在Global.asax中全球行动过滤器。



Answer 2:

答案是正确的,但。 使用它一段时间后我碰到的情况来到时,响应在许多地方被分裂,使HTML是不正确

Part 1: 
<html>.....<labe

Part 2: 
l/>...</html>

另外部分呈现可能使意外情况。 他们的HTML是出了主流的了。 所以我的解决办法是做在冲洗方法中的所有数据流完成后。

    /// <summary>
    /// Insert messages and script to display on client when a partial view is returned
    /// </summary>
    private class ResponseFilter : MemoryStream
    {
        private readonly Stream _response;
        private readonly IList<object> _detachMessages;

        public override void Flush()
        {

            // add messages and remove
            // filter is called for a number of methods on one page (BeginForm, RenderPartial...)
            // so that we don't need to add it more than once

            var html = MessageAndScript(_detachMessages);
            var buffer = Encoding.UTF8.GetBytes(html);
            _detachMessages.Clear();
            _response.Write(buffer, 0, buffer.Length);

            base.Flush();
        }

        public ResponseFilter(Stream response, IList<object> detachMessages)
        {
            _response = response;
            _detachMessages = detachMessages;
        }

        public override void Write(byte[] buffer, int offset, int count)
        {
            _response.Write(buffer, offset, buffer.Length);    
        }

        private static string MessageAndScript(IList<object> detachMessages)
        {

            if (detachMessages.Count == 0)
                return null;

            var javascript = CustomJavaScriptSerializer.Instance.Serialize(detachMessages);

            return "$(function(){var messages = " + javascript + @";
// display messages
base.ajaxHelper.displayMessages(messages);
})";
        }
    }


文章来源: asp.net MVC 3/4 equivalent to a response.filter