5

@Html.RenderPartialwrite を呼び出して戻りますがvoid、まだStringWriter/に書き込んでいますStringBuilder。に直接レンダリングする方法はありResponseStreamますか?

に直接出力IViewEngineするように render を実装するカスタムでこれを行うことはできますか?PdfViewResponseStream

添加

ViewResultBase.ExecuteResultViewContextでビルドされていることを示していResponse.Outputますが、デバッガーはViewContext.WriterStringWriter

これらのアプローチはどちらも、StringWriter

return PartialView("view", Model)
// or
PartialView("view", Model).ExecuteResult(ControllerContext)

編集

コンテキストスタックにSystem.Web.WebPages.WebPageBase ExecutePageHeirarchy一時をプッシュしているように見えるので、これをバイパスできるかどうかはわかりませんStringWriter

要約すれば

RenderPartial、RenderAction は Response.Stream に直接出力せず、Razor ビューも出力しません。

解決

StringWriterすべてを aから aでラップするのは、新しい WebPages/Razor レンダリング エンジンでしたStringBuilderWebFormViewEngine解決策は、このラッピングを適用しないを使用するようにページを変更すること でした。

4

1 に答える 1

0

以下の方法は、探している結果を達成する 1 つの方法を示しています。

// <summary>
// An extension methods for rendering a model/view into a stream
// </summary>
// <param name="myModel">The model you are trying render to a stream</param>
// <param name="controllerBase">This will come from your executing action</param>
// <returns></returns>
        public static Stream GetStream(CustomModel myModel, ControllerBase controllerBase)
        {
            //we will return this stream
            MemoryStream stream = new MemoryStream();

            //you can add variables to the view data
            controllerBase.ViewData["ViewDataVariable1"] = true;

            //set your model
            controllerBase.ViewData.Model = myModel;

            //The example uses the UTF-8 encoding, you should change that if you are using some other encoding.
            //write to a stream
            using (StreamWriter writer = new StreamWriter(stream, Encoding.UTF8))
            {
                using (var sw = new StringWriter())
                {
                    //render the view  ~/Views/Shared/_FeedbackMessage.cshtml (can be passed in as a parameter if you want to make it super generic)
                    var viewResult = ViewEngines.Engines.FindPartialView(controllerBase.ControllerContext, "_FeedbackMessage");

                    //create a new view context
                    var viewContext = new ViewContext(controllerBase.ControllerContext, viewResult.View, controllerBase.ViewData, controllerBase.TempData, sw);

                    //Render the viewengine and let razor do its magic
                    viewResult.View.Render(viewContext, sw);    
                    viewResult.ViewEngine.ReleaseView(controllerBase.ControllerContext, viewResult.View);

                    //get StringBuilder from StringWriter sw and write into the stream writer
                    //you could simply return the StringWriter here if that is what you were interested in doing
                    writer.Write(sw.GetStringBuilder().ToString());

                    writer.Flush();

                    stream.Position = 0;
                }

            }

            //return the stream from the above process
            return stream;
        }
于 2015-12-31T11:04:06.847 に答える