Возврат представления как части объекта JSON
У меня есть приложение, которое загружает полный просмотр только один раз. Моя причина для этого не важна. Что важно, так это то, что остальная часть контента будет возвращаться только частично. В дополнение к некоторому контенту у меня есть некоторые объекты JSON, которые я хотел бы передавать взад и вперед на сервер и с сервера при каждом запросе AJAX.
Есть ли способ вернуть объект JSON с представлением в качестве одного из его свойств? Это было бы чрезвычайно полезно и позволило бы сэкономить на пропускной способности, так как мой текущий обходной путь - сделать два вызова ajax, один для JSON и один для частичного просмотра, который не только требует больше времени и большей пропускной способности, но также требует двух отдельных методов действия и некоторые хитрости на стороне сервера. Сериализация представления в JSON-объект решит все мои проблемы.
Каков наилучший способ для достижения этой цели и какие недостатки (если таковые имеются) будет делать это?
2 ответа
Вот интересный кусок кода, который, кажется, выполняет то, что я хочу, и сохраняет привязку модели к тому, что я могу сказать.
protected string RenderPartialViewToString(string viewName, object model)
{
controller.ViewData.Model = model;
using (StringWriter sw = new StringWriter())
{
ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
viewResult.View.Render(viewContext, sw);
return sw.GetStringBuilder().ToString();
}
}
Работает как шарм. Я просто использую это и передаю строку в качестве параметра JSON, а затем на клиенте читаю параметр и помещаю его в соответствующий контейнер. Я очень рад, что это работает.
Вы можете визуализировать представление из контроллера и вернуть его с объектом JSON обратно клиенту.
Если вы будете использовать мой простой помощник для рендеринга ActionResult в строку, тогда ваш код будет выглядеть так:
public JsonResult DoSomething() {
var viewString = View().Capture(ControllerContext);
return new JsonResult {
JsonRequestBehavior = JsonRequestBehavior.AllowGet,
Data = new {
time = DateTime.Now,
html = viewString
}
};
}