Возврат представления как части объекта JSON - PullRequest
1 голос
/ 11 ноября 2010

У меня есть приложение, которое загружает полный просмотр только один раз.Моя причина для этого не важна.Что важно, так это то, что остальная часть контента будет возвращаться только частично.В дополнение к некоторому контенту у меня есть некоторые объекты JSON, которые я хотел бы передавать взад и вперед на сервер и с сервера при каждом запросе AJAX.

Есть ли способ вернуть объект JSON с представлением в качестве одного изего свойства?Это было бы чрезвычайно полезно и позволило бы сэкономить на пропускной способности, поскольку мой текущий обходной путь - сделать два вызова ajax, один для JSON и один для частичного просмотра, который не только требует больше времени и большей пропускной способности, но также требует двух отдельных методов действия инекоторые хитрости на стороне сервера.Сериализация представления в JSON-объект решит все мои проблемы.

Каков наилучший способ сделать это и какие недостатки (если таковые имеются) будут в этом?

Ответы [ 2 ]

3 голосов
/ 11 ноября 2010

Вы можете визуализировать представление из контроллера и вернуть его с объектом JSON обратно клиенту.

Если вы будете использовать мой простой помощник для рендеринга ActionResult в строку , тогда ваш код будет выглядеть так:

public JsonResult DoSomething() {
    var viewString = View().Capture(ControllerContext);
    return new JsonResult {
        JsonRequestBehavior = JsonRequestBehavior.AllowGet,
        Data = new {
            time = DateTime.Now,
            html = viewString
        }
    };
}
1 голос
/ 11 ноября 2010

Вот интересный кусок кода, который, кажется, выполняет то, что я хочу, и сохраняет привязку модели к тому, что я могу сказать.

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, а затем на клиенте читаю параметр и помещаю его в соответствующий контейнер. Я очень рад, что это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...