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