Сохранить viewdata в RedirectToAction
[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 Index в [NonAction] и вызвать этот метод как из действия индекса, так и из действия CreateUser, но у меня есть ощущение, что должен быть лучший способ.
Спасибо.
Ответы
Ответ 1
Вы можете использовать TempData
.
TempData["info"] = "The account has been created."
.
TempData существует именно для этой ситуации. Он использует сеанс как хранилище, но после второго ответа его не будет.
Из MSDN:
Типичным использованием объекта TempDataDictionary является передача данных из метода действия при перенаправлении на другой метод действия. Например, метод действия может хранить информацию об ошибке в свойстве контроллера TempData (который возвращает объект TempDataDictionary), прежде чем он вызовет метод RedirectToAction. Следующий метод действия может затем обработать ошибку и отобразить представление, отображающее сообщение об ошибке.
Ответ 2
Используйте ViewData
, если ваши данные должны быть доступны в View
во время запроса "this". Используйте "TempData", если ваши данные для "следующего" запроса (например шаблон дизайна POST-REDIRECT-GET).
Ответ 3
Если вам это нужно больше одного раза, хорошим решением будет создание ActionFilterAttributes, который экспортирует/импортирует tempdata в viewdata и наоборот. Вы можете передать свой ModelState таким образом очень хорошо (продемонстрировано здесь - # 13).
Думаю, что с некоторыми изменениями в этом фрагменте кода у вас будет чистое решение.
Ответ 4
Вы можете использовать свойство контроллера TempData
, но у него есть недостаток, что он использует хранилище сеансов в фоновом режиме. Это означает, что у вас будет дополнительная работа, чтобы заставить ее работать в веб-ферме, и вам сначала необходимо включить сеансы в ваше приложение.
Альтернативой является использование файлов cookie, если вам нужно только передать короткое сообщение. Это требует правильного шифрования файла cookie. Не полагаясь на свойство TempData
, вы также можете устанавливать сообщения в контексте, отличном от MVC, например, на классической странице ASHX.
Взгляните на FlashMessage, который может сэкономить вам некоторые работы, реализующие это самостоятельно.
Ответ 5
Так как TempData, похоже, использует хранилище, и любая форма ITempDataProvider, которая не является "in-process", требует, чтобы объект был Serializable, TempData кажется крайне неадекватным в ситуациях веб-ферм... (ViewDataDictionary сам по себе не сериализуется...) Есть ли у кого-нибудь предложения для этого?