Действие рендеринга Mvc / частичное к выходу ответа
Хотя @Html.RenderPartial
звонки пишут и возвращают void
, он все еще пишет StringWriter
/StringBuilder
, Есть ли способ сделать прямо на ResponseStream
?
Можно ли это сделать с помощью обычая IViewEngine
который реализует рендер как PdfView
напрямую выводить на ResponseStream
?
Сложение
ViewResultBase.ExecuteResult
показывает ViewContext
строится с Response.Output
но отладчик показывает 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
который не применяет эту упаковку.
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;
}