如何使用ASP.NET MVC中的属性将自定义HTML附加到视图的末尾?

sas*_*eve 6 action-filter asp.net-mvc-3

假设我们在控制器中有一些动作:

public ActionResult SomeAction()
{
    return View();
}
Run Code Online (Sandbox Code Playgroud)

我希望有可能借助属性将一些HTML代码附加到视图的HTML结果的末尾,例如:

[SomeHTML]
public ActionResult SomeAction()
{
    return View();
}
Run Code Online (Sandbox Code Playgroud)

哪里

public class SomeHTMLAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        var response = filterContext.HttpContext.Response;

        if (response.ContentType == "text/html")
        {
            response.Write("someHTML");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

过滤器(ActionFilterAttribute)允许将一些HTML代码附加到网页的顶部或底部,但不能附加到视图的HTML末尾.

如何存档?

Dar*_*rov 12

您可以使用Response过滤器:

public class SomeHTMLAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Filter = new SomeHTMLFilter(filterContext.HttpContext.Response.Filter);
        base.OnActionExecuting(filterContext);
    }
}

public class SomeHTMLFilter : MemoryStream
{
    private readonly Stream _outputStream;
    public SomeHTMLFilter(Stream outputStream)
    {
        _outputStream = outputStream;
    }

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

    public override void Close()
    {
        var buffer = Encoding.UTF8.GetBytes("Hello World");
        _outputStream.Write(buffer, 0, buffer.Length);
        base.Close();
    }
}
Run Code Online (Sandbox Code Playgroud)