加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – Mvc渲染动作/部分响应输出

发布时间:2020-12-16 07:41:57 所属栏目:asp.Net 来源:网络整理
导读:虽然@ Html.RenderPartial调用write并返回void,但它仍然写入StringWriter / StringBuilder.有没有办法直接渲染到ResponseStream? 这可以通过自定义IViewEngine完成,它实现像PdfView这样的渲染直接输出到ResponseStream吗? 加成 ViewResultBase.ExecuteResu
虽然@ Html.RenderPartial调用write并返回void,但它仍然写入StringWriter / StringBuilder.有没有办法直接渲染到ResponseStream?

这可以通过自定义IViewEngine完成,它实现像PdfView这样的渲染直接输出到ResponseStream吗?

加成

ViewResultBase.ExecuteResult显示使用Response.Output构建的ViewContext,但调试器将ViewContext.Writer显示为StringWriter

这两种方法都会产生StringWriter

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

编辑

似乎System.Web.WebPages.WebPageBase ExecutePageHeirarchy将临时StringWriter推送到上下文堆栈,所以我不确定是否可以绕过它

综上所述

RenderPartial,RenderAction不直接输出到Response.Stream,Razor Views都不会

这是新的WebPages / Razor渲染引擎,它将StringWriter的所有内容包装到StringBuilder中.解决方案是更改我的页面以使用不应用此包装的WebFormViewEngine.

解决方法

以下方法说明了实现您正在寻找的结果的一种方法:

// <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;
        }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读