我是一个需要拦截所有将要发送到浏览器的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。
你仍然可以使用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中全球行动过滤器。
答案是正确的,但。 使用它一段时间后我碰到的情况来到时,响应在许多地方被分裂,使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);
})";
}
}