TempData перемещается из представления в контроллер

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

Спасибо


person SoftwareSavant    schedule 01.12.2011    source источник
comment
Вы не должны устанавливать TempData из представления, если вам это нужно, рассмотрите возможность изменения вашего дизайна.   -  person Abdul Munim    schedule 01.12.2011


Ответы (2)


Предполагается, что ни 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 или перенаправление на сервер
person Darin Dimitrov    schedule 01.12.2011
comment
Я боялся этого. Так как же обрабатывать обновления страницы с помощью кнопки (созданной из формы), если вы получили данные из репозитория TempData? В настоящее время, чтобы обновить с помощью кнопки, я просто снова вызываю контроллер из actionLink... Вот в чем проблема. В этом контроллере есть некоторая информация из репозитория TempData. Если я назову это и его значение null, страница не перезагрузится должным образом. Есть ли лучший способ сделать это? - person SoftwareSavant; 01.12.2011
comment
@DmainEvent, это как раз одна из проблем TempData. Страница обновляется по F5. Это может быть ПИТА. Лично я никогда не использую TempData. Если мне нужно что-то сохранить, чтобы оно пережило обновление страницы, я сохраняю это в своем бэкэнде, чтобы я всегда мог получить его, если это необходимо, с учетом его уникального идентификатора. TempData действительно следует использовать для очень недолговечного механизма хранения объектов: например, для таких вещей, как сообщения уведомлений. - person Darin Dimitrov; 01.12.2011
comment
Как бы вы сохранили его в бэкэнде? Например, база данных или какой-то механизм, например сеанс, который вы используете? - person SoftwareSavant; 01.12.2011
comment
@DmainEvent, когда я говорю «бэк-энд», это может означать любое централизованное хранилище, позволяющее получить эту информацию позже. Это будет зависеть от конкретных требований моего приложения. Может варьироваться от файлов cookie на клиентах, файлов на сервере, проходя через хранилища пар ключ/значение NoSQL до реляционной базы данных. Сессия для меня исключена. Ненавижу и никогда не использую. - person Darin Dimitrov; 01.12.2011
comment
Я чувствую твою боль. Я презираю сеансы. Хммм: возможно, мне придется сделать серьезный редизайн. - person SoftwareSavant; 01.12.2011
comment
Вот в чем моя проблема. Я пытаюсь получить XML между контроллерами. Я получаю это исключение, когда пытаюсь запустить свой сайт... Неверный URI: слишком длинная строка Uri. - person SoftwareSavant; 01.12.2011
comment
@DmainEvent, может быть, вы могли бы начать новый вопрос, показать свой точный код, объяснить свою проблему, ... - person Darin Dimitrov; 01.12.2011

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

person Chris Fulstow    schedule 01.12.2011