сохранить данные просмотра на RedirectToAction - PullRequest
37 голосов
/ 04 августа 2009
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult CreateUser([Bind(Exclude = "Id")] User user)
{
        ...
        db.SubmitChanges();
        ViewData["info"] = "The account has been created.";
        return RedirectToAction("Index", "Admin");
}

Это не сохраняет текст "info" в viewdata после redirectToAction. Как мне обойти эту проблему самым элегантным способом?

Моя текущая идея - поместить материал из элемента управления Index в [NonAction] и вызвать этот метод как из действия Index, так и из действия CreateUser, но я чувствую, что должен быть лучший способ.

Спасибо.

Ответы [ 5 ]

71 голосов
/ 04 августа 2009

Вы можете использовать TempData.

TempData["info"] = "The account has been created.".

TempData существует именно для этой ситуации. Он использует Session в качестве хранилища, но его не будет после второго ответа.

Из MSDN:

Типичным использованием объекта TempDataDictionary является передача данных из метода действия при его перенаправлении в другой метод действия. Например, метод действия может хранить информацию об ошибке в свойстве TempData контроллера (которое возвращает объект TempDataDictionary) до вызова метода RedirectToAction. Затем следующий метод действия может обработать ошибку и отобразить представление, отображающее сообщение об ошибке.

12 голосов
/ 04 августа 2009

Используйте ViewData, если ваши данные должны быть доступны в View во время «этого» запроса. Используйте TempData, если ваши данные предназначены для «следующего» запроса (например, POST-REDIRECT-GET шаблон проектирования ).

2 голосов
/ 30 сентября 2015

Можно использовать свойство контроллера TempData, но его недостатком является то, что он использует хранилище сеансов в фоновом режиме. Это означает, что вам придется потрудиться, чтобы он работал в веб-ферме, и вам сначала нужно включить сеансы в вашем приложении.

Альтернативой является использование файлов cookie, если вам нужно только отправить короткое сообщение. Это требует правильного шифрования куки. Отказ от использования свойства TempData также позволяет устанавливать сообщения в контексте, отличном от MVC, например на классической странице ASHX.

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

2 голосов
/ 26 октября 2009

Если вам нужно это более одного раза, хорошим решением будет создание ActionFilterAttributes, которые экспортируют / импортируют tempdata в viewdata и наоборот. Вы также можете очень хорошо передать свой ModelState (продемонстрировано здесь - # 13). Я думаю, что с некоторыми изменениями в этом фрагменте кода у вас будет чистое решение.

1 голос
/ 24 июня 2014

Поскольку TempData, по-видимому, использует хранилище, а любая форма ITempDataProvider, которая не является «внутрипроцессной», требует, чтобы объект был Serializable, TempData кажется крайне неадекватным в ситуациях веб-фермы ... (ViewDataDictionary сам по себе не сериализуем. ..) У кого-нибудь есть предложения по этому поводу?

...