はい、可能です。
ご存じのとおり、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();
}