Come eseguire il rendering di una vista del razor su una stringa in ASP.NET MVC 3?

Ho cercato molto sul sito, ma tutto quello che ho potuto trovare erano esempi su come eseguire il rendering di controlli parziali .ascx , o dipendeva dal contesto di un controller.

Voglio un metodo che mi consenta di fornire solo il percorso relativo alla vista e un modello e di rendere quella vista con quel modello in una stringa:

 string result = Utility.RenderViewToString("~/Views/My/Profile.cshtml", model); 

Tutti gli esempi che ho trovato erano o per versioni precedenti di MVC, o semplicemente non facevo quello che dovevo fare qui.

Puoi farlo con il razor .

 string template = "Hello @Model.Name! Welcome to Razor!"; string result = Razor.Parse(template, new { Name = "World" }); 

E non si basa sul contesto del controller, ma a causa di ciò non si è in grado di utilizzare gli helper Html (che si basano sul contesto http). Ma è perfetto usare il razor come motore di template per le stringhe.

Puoi controllare questo link.

contenuto estratto Da Render Razor view a String . .

 public static 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); return sw.GetStringBuilder().ToString(); } } 

Ho creato una soluzione per me. È Extension che renderizza la vista in una stringa.

 public static class RenderPartialToStringExtensions { ///  /// render PartialView and return string ///  ///  ///  ///  ///  public static string RenderPartialToString(this ControllerContext context, string partialViewName, object model) { return RenderPartialToStringMethod(context, partialViewName, model); } ///  /// render PartialView and return string ///  ///  ///  ///  ///  ///  public static string RenderPartialToString(ControllerContext context, string partialViewName, ViewDataDictionary viewData, TempDataDictionary tempData) { return RenderPartialToStringMethod(context, partialViewName, viewData, tempData); } public static string RenderPartialToStringMethod(ControllerContext context, string partialViewName, ViewDataDictionary viewData, TempDataDictionary tempData) { ViewEngineResult result = ViewEngines.Engines.FindPartialView(context, partialViewName); if (result.View != null) { StringBuilder sb = new StringBuilder(); using (StringWriter sw = new StringWriter(sb)) { using (HtmlTextWriter output = new HtmlTextWriter(sw)) { ViewContext viewContext = new ViewContext(context, result.View, viewData, tempData, output); result.View.Render(viewContext, output); } } return sb.ToString(); } return String.Empty; } public static string RenderPartialToStringMethod(ControllerContext context, string partialViewName, object model) { ViewDataDictionary viewData = new ViewDataDictionary(model); TempDataDictionary tempData = new TempDataDictionary(); return RenderPartialToStringMethod(context, partialViewName, viewData, tempData); } } 

E di quanto possiamo rendere la vista in azione

 [HttpPost] public ActionResult GetTreeUnit(string id) { int _id = id.ExtractID(); string render = ControllerContext.RenderPartialToString("SomeView"); return Json(new { data = render }); } 

Anche se Marc è la risposta è corretta e funziona per le versioni precedenti. Ma ora è obsoleto e deve essere sostituito.

Ecco il nuovo codice che ha funzionato per me e puoi trovare ulteriori informazioni utili su Github: Razor Engine

 string template = "Hello @Model.Name! Welcome to Razor!"; string Result = Engine.Razor.RunCompile(template, "templateKey", null, new { Name = "World" });