I need to use the html generated by a razor template in one of my controllers, an abstract one actually to handle ajax lists. That way I can have a generic ajax list implementation which will work for any type of model, and provide the standard operations like add/edit/delete ...
Since I'd like to generate the list elements on the server, I thought I could make razor templates for each element, and then return the generated html (for a new element, or for editing an element) in a JSON object like this:
At first I thought about instantiating an HtmlHelper
(as explained here: HtmlHelper in controller ) and using the EditorFor
method, but I'm wondering if this a good way to achieve this, since creating an instance of HtmlHelper
seems to be quite a time consuming operation.
Is there a simple way to execute the right razor template and get the html in a string?
Also is there a better way to implement such a generic behavior?
I created a method that does the trick. My reason for creating the method was the same as yours; I wanted to return a JsonResult
that contained not only the markup but some other data as well.
public string RenderPartialViewToString(string viewName, object model, ViewDataDictionary viewData = null)
{
ViewData.Model = model;
if (viewData != null)
foreach (KeyValuePair<string, object> item in viewData)
ViewData.Add(item);
using (var sw = new System.IO.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();
}
}
I placed this method in my base controller so all my controllers have access to it.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.