Является ли http://craftycodeblog.com/2010/05/15/asp-net-mvc-render-partial-view-to-string/ тем, что вы ищете?
Скопировано с помощью WayBackMachine.
Я столкнулся с ситуацией, в которой я хотел бы визуализировать частичное представление строки, а затем вернуть его как часть ответа JSON, например:
return Json(new {
statusCode = 1,
statusMessage = "The person has been added!",
personHtml = PartialView("Person", person)
});
Возможность сделать что-то подобное открыла бы массу удивительных возможностей, поэтому я действительно искал интернет, ища решение. К сожалению, кажется, никто не придумал чистого решения для этого, поэтому я копался в коде MVC и придумал один… и, поскольку я такой хороший парень, вы можете скопировать его бесплатно. ;)
public abstract class MyBaseController : Controller {
protected string RenderPartialViewToString()
{
return RenderPartialViewToString(null, null);
}
protected string RenderPartialViewToString(string viewName)
{
return RenderPartialViewToString(viewName, null);
}
protected string RenderPartialViewToString(object model)
{
return RenderPartialViewToString(null, model);
}
protected string RenderPartialViewToString(string viewName, object model)
{
if (string.IsNullOrEmpty(viewName))
viewName = ControllerContext.RouteData.GetRequiredString("action");
ViewData.Model = model;
using (StringWriter sw = new StringWriter()) {
ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
viewResult.View.Render(viewContext, sw);
return sw.GetStringBuilder().ToString();
}
}
}
Теперь вы можете просто сделать это:
public class MyController : MyBaseController {
public ActionResult CreatePerson(Person p) {
if (ModelState.IsValid) {
try {
PersonRepository.Create(p);
return Json(new {
statusCode = 1,
statusMessage = "The person has been added!",
personHtml = RenderPartialViewToString("Person", p)
});
}
catch (Exception ex) {
return Json(new {
statusCode = 0,
statusMessage = "Error: " + ex.Message
});
}
}
else
return Json(new {
statusCode = 0,
statusMessage = "Invalid data!"
});
}
}
Также обратите внимание, что вы можете изменить эти функции для рендеринга View (а не PartialView) с этим небольшим изменением:
ViewEngineResult viewResult = ViewEngines.Engines.FindView(ControllerContext, viewName);
Наслаждайтесь!