加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 03:41:48 所属栏目:asp.Net 来源:网络整理
导读:我需要拦截将发送到浏览器的所有html并替换那里的一些标签.这需要在全球范围内和每个视图中完成.使用C#在ASP.NET MVC 3或4中执行此操作的最佳方法是什么?在过去,我使用Global.asax(vb)中的’response.filter’在ASP.net Webforms中完成了此操作 Private Sub
我需要拦截将发送到浏览器的所有html并替换那里的一些标签.这需要在全球范围内和每个视图中完成.使用C#在ASP.NET MVC 3或4中执行此操作的最佳方法是什么?在过去,我使用Global.asax(vb)中的’response.filter’在ASP.net Webforms中完成了此操作

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世界中是一个全新的人.

解决方法

您仍然可以在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中的全局操作筛选器.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读