Wpis z mikrobloga

Jak mogę wyrenderować stringa z PartialViewResult (dziedziczy z ActionResult) BEZ konieczności posiadania .ControllerContext?

Mam ten popularny kawałek kodu, który robi to w normalnej sytuacji (jedna z [NonAction] metod kontrolera) - i muszę przyznać, działa to świetnie - generuje piękny kod HTML z PartialViewResult, który potem jest przypisywany jako jedna z Właściwości Json'a.

Problem w tym, że muszę wygenerować ten kod poza kontrolerem. Wtedy bez zaskoczenia, .ControllerContext jest null.

To jest niesamowite, że za generowanie kodu HTML jako string odpowiada najwyraźniej JEDNA metoda IView.Render() (sprawdzałem, potrzebuje ViewContext pobieranego z ControllerContext).

Najłatwiej byłoby zrobić modyfikację w kodzie źródłowym aplikacji, ale ta odpada (nie moja decyzja). Anyways, zrobiłem modyfikację w źródle i faktycznie, działa świetnie (tj. mogę wyrenderować kod HTML jako string taki jaki chcę i .ControllerContext NIE JEST pusty).

Wyżej wymieniona metoda generująca kod HTML jako string na podstawie PartialViewResult

public string RenderRazorViewToString(string viewName, object model) {
ViewData.Model = model;
using (var sw = new StringWriter()) {
var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
viewResult.View.Render(viewContext, sw);
viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View);
return sw.GetStringBuilder().ToString();
}
}


#csharp #aspnet #aspnetmvc #programowanie
  • 2