TempData перемещается из вида в контроллер - PullRequest
1 голос
/ 01 декабря 2011

Я пытаюсь вызвать контроллер через actionLink() в представлении.Этот контроллер получает данные из хранилища TempData.Однако, кажется, что независимо от того, что я делаю, если я установлю репозиторий TempData в виде, он не перейдет к контроллеру?Должен ли я использовать ViewData вместо этого?Что вы посоветуете для такой системы?

Спасибо

Ответы [ 2 ]

2 голосов
/ 01 декабря 2011

Необходимо заранее установить значение TempData в контроллере, который отображает ваш вид. Затем значение будет получено действием контроллера, которое отображает ваше второе представление (ActionLink).

2 голосов
/ 01 декабря 2011

TempData, ни ViewData не должны быть установлены в представлении. Предполагается, что представление использует данные, которые были сохранены в этих структурах внутри действий вашего контроллера (ну, на самом деле это не так, представление должно использовать модель представления, но это уже другая тема).

TempData может использоваться, если вы хотите сохранить информацию между двумя перенаправлениями. Он должен быть установлен внутри действия контроллера, которое перенаправляет на другое действие контроллера, которое будет считывать данные:

public ActionResult Foo()
{
    SomeModel model = ...
    TempData["foo"] = model;
    return RedirectToAction("Bar");
}

public ActionResult Bar()
{
    var model = TempData["foo"] as SomeModel;
    ...
}

Таким образом, действие контроллера должно получать данные из структуры TempData, только если это действие было вызвано после перенаправления из другого действия, которое устанавливает данные. Такое действие контроллера никогда не должно вызываться из представления, потому что если у вас есть представление, это означает, что это представление было визуализировано из действия контроллера, которое предположительно устанавливает данные в TempData, но всегда существует риск (если представление выполняется между запросом к сервер - AJAX или что-то), данные TempData будут потеряны.

Для вашего случая, когда представлению необходимо вызвать сервер, в основном есть 3 метода:

  • Использовать HTML <form> с полями ввода, которые будут отправлять данные на сервер
  • Использование привязки и передача данных в качестве параметров строки запроса в контроллер
  • Используйте JavaScript и отправьте запрос AJAX или перенаправление на сервер
...