可以在Razor页面中使用Steven Sanderson的部分请求技术吗?

时间:2011-11-26 17:41:35

标签: asp.net-mvc razor request asp.net-mvc-partialview

我喜欢史蒂文桑德森在http://blog.stevensanderson.com/2008/10/14/partial-requests-in-aspnet-mvc/中的部分请求的想法,我试图让它与Razor页面一起使用。不幸的是,它将它写到页面的顶部,而不是我真正希望它在文档中的位置。我猜这个问题类似于这里回答的问题:ASP.Net MVC 3 Razor Response.Write position但我不知道如何绕过它。

任何人都可以为我提供解决方法吗?如果不这样做,是否还有一种很好的技术可以在视图中呈现另一个动作的内容,而不必让该视图知道动作?

1 个答案:

答案 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();
}