我喜欢史蒂文桑德森在http://blog.stevensanderson.com/2008/10/14/partial-requests-in-aspnet-mvc/中的部分请求的想法,我试图让它与Razor页面一起使用。不幸的是,它将它写到页面的顶部,而不是我真正希望它在文档中的位置。我猜这个问题类似于这里回答的问题:ASP.Net MVC 3 Razor Response.Write position但我不知道如何绕过它。
任何人都可以为我提供解决方法吗?如果不这样做,是否还有一种很好的技术可以在视图中呈现另一个动作的内容,而不必让该视图知道动作?
答案 0 :(得分:1)
是的,有可能。
我确信你现在知道Razor视图引擎在写入响应流之前写入临时缓冲区,这就是为什么当你调用另一个动作时,标记会不按顺序写入响应。
我过去使用过的解决方法是在尝试渲染其他操作时,暂时将对响应的任何写入重定向到MemoryStream
,然后从内容创建MvcHtmlString
MemoryStream
。
类似于:
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();
}