Можно ли использовать технику частичного запроса Стивена Сандерсона на страницах Razor? - PullRequest
2 голосов
/ 26 ноября 2011

Мне нравится идея частичных запросов Стивена Сандерсона в http://blog.stevensanderson.com/2008/10/14/partial-requests-in-aspnet-mvc/, и я пытаюсь заставить ее работать со страницами Razor. К сожалению, он записывает это в верхнюю часть страницы, а не там, где я хочу, чтобы это было в документе. Я предполагаю, что проблема похожа на ответ здесь: ASP.Net MVC 3 Razor Response.Пишите положение , но я не знаю, как обойти это.

Может ли кто-нибудь предоставить мне обходной путь? В противном случае, существует ли просто еще один хороший метод для визуализации содержимого другого действия в представлении, если этому представлению не нужно знать о действии?

1 Ответ

1 голос
/ 27 ноября 2011

Да, это возможно.

Как я уверен, теперь вы знаете, что механизм представления 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();
}
...