You could use the RenderPartialViewToString
method shown in this answer to render the view to a string and then return the custom JsonpResult you have written:
public class StudentsController : Controller
{
public ActionResult Index()
{
MyViewModel model = ...
return new JsonpResult(new
{
html = RenderViewToString("Index", model)
});
}
public string RenderViewToString(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();
}
}
protected string RenderPartialViewToString(string viewName, object model)
{
if (string.IsNullOrEmpty(viewName))
{
viewName = ControllerContext.RouteData.GetRequiredString("action");
}
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();
}
}
}
The JsonpResult
class used here could be found in this post.
And now you could invoke this controller action using AJAX from another domain:
var url = 'http://example.com/students/index';
$.getJSON(url + '?callback=?', function (data) {
alert(data.html);
});