2

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

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

4

1 回答 1

1

对的,这是可能的。

我确信您现在知道 Razor 视图引擎会在写入响应流之前写入临时缓冲区,这就是为什么当您调用另一个操作时,标记会乱序写入响应。

我过去使用的解决方法是将任何写入临时重定向到响应,MemoryStream而您正在尝试呈现另一个操作,然后MvcHtmlStringMemoryStream.

所以像:

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();
}
于 2011-11-27T14:18:49.217 回答