Возврат представления как части объекта 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
        }
    };
}
Другие вопросы по тегам