2

http://blog.stevensanderson.com/2008/10/14/partial-requests-in-aspnet-mvc/にある Steven Sanderson の Partial Requests のアイデアが好きで、Razor ページで動作するようにしようとしています。残念ながら、ドキュメント内で実際に配置したい場所ではなく、ページの上部に書き込みます。問題はここで回答されたものと似ていると思います: ASP.Net MVC 3 Razor Response.Write positionしかし、それを回避する方法がわかりません。

誰かが私に回避策を提供できますか? それができない場合、別のアクションのコンテンツをビューにレンダリングするための別の優れた手法はありますか?そのビューはアクションについて知る必要はありませんか?

4

1 に答える 1

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