Обновление ViewData в методе, который возвращает Json

У меня есть контроллер с методом, который возвращает частичное представление и генерирует ViewData. Затем у меня есть несколько методов, каждый из которых возвращает объекты Json и ViewData. Но ViewData не обновляется. Как его обновить? Это возможно?

public ActionResult FirstMethod() {
    ViewData["someList"] = ...;
    return PartialView(someOtherList);
}

public JsonResult SomeMethod()
{
    ViewData["someNewList"] = ...;
    return new JsonResult { ... };
}

Но, хотя SomeMethod() вызывается после FirstMethod(), ViewData, который я использую в своем представлении, — это someList.


person petko_stankoski    schedule 29.05.2012    source источник
comment
@ Марк Да. Я отредактировал вопрос.   -  person petko_stankoski    schedule 29.05.2012
comment
ViewData будет очищаться в каждом запросе, как объяснил @Darin, и вам не нужно делать это вручную. Обычно каждое действие (если оно не является дочерним) соответствует запросу браузера. Поэтому, если вы установите какое-либо значение для ViewData в одном действии, оно не будет доступно в другом.   -  person VJAI    schedule 29.05.2012


Ответы (1)


Это возможно?

Нет, это невозможно. ViewData — это слабо типизированный словарь, который можно использовать (хотя я бы не рекомендовал его использовать) для передачи информации между контроллером и представлением. Его время жизни привязано к сроку службы конвейера выполнения действий контроллера. Итак, как только представление визуализируется, все кончено. Нет контроллера, представления, ViewData, ... больше не существует. В клиентском браузере отображается только HTML.

Затем вы снова отправляете запрос AJAX на сервер. Это совершенно новый запрос, который не имеет ничего общего с первым (который изначально использовался для рендеринга представления), и поэтому создается новый экземпляр контроллера со своими собственными ViewData. Установка ViewData в действии контроллера, которое возвращает JSON, бесполезно, потому что, поскольку это действие будет вызываться с помощью javascript, вся информация, которую вы хотите передать от контроллера обработчику успеха javascript, должна быть частью возвращаемого объекта JSON.

person Darin Dimitrov    schedule 29.05.2012
comment
Почему вы не рекомендуете использовать ViewData? - person petko_stankoski; 29.05.2012
comment
Потому что он слабо типизирован. Я рекомендую использовать модели представления. - person Darin Dimitrov; 29.05.2012