是的,这是可能的。
因为我确定您现在知道Razor视图引擎在写入响应流之前写入临时缓冲区,这就是为什么当您调用另一个操作时,标记将被写入响应中的顺序。
我过去使用的解决方法是临时将任何写入的响应重定向到MemoryStream
,同时尝试呈现其他操作,然后从MemoryStream
的内容创建MvcHtmlString
。
因此,像:
public class HttpResonseCapture : IDisposable
{
private readonly MemoryStream _stream = new MemoryStream();
private readonly Stream _originalStream;
private readonly HttpContextBase _httpContext;
public HttpResponseCapture(HttpContextBase httpContext)
{
_httpContext = httpContext;
_originalStream = httpContext.Response.OutputStream;
httpContext.Response.OutputStream = _stream;
}
public MvcHtmlString ToHtmlString()
{
return MvcHtmlString.Create(Encoding.Unicode.GetString(_stream.ToArray()));
}
public void Dispose()
{
_httpContext.Response.OutputStream = _originalStream;
_stream.Dispose();
}
}
可以使用像这样:
using (var responseCapture = new HttpResponseCapture(httpContext))
{
// Call other action here
var result = responseCapture.ToHtmlString();
}
只是出于兴趣,你使用Html.RenderPartial?如果是这样,我会尝试使用Html.Partial,因为RenderPartial将直接写入响应,并且Partial将返回一个MvcHtmlString,如果您有多个循环正在进行,则可能会以不同的方式处理该MvcHtmlString。 – SGB
在这个例子中,我使用博客文章中说明的html助手,该助手在PartialRequest对象上调用Invoke(部分视图然后直接写入,因此不会返回任何内容)。我遇到的问题是我调用的操作附带了一个AuthorizeAttribute,以防止某些用户登录时完全显示它,这就是为什么我不能使用Partial或RenderPartial – NickL