Подтвердить что ты не робот

Сохранить 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, но у меня есть ощущение, что должен быть лучший способ.

Спасибо.

4b9b3361

Ответ 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 сам по себе не сериализуется...) Есть ли у кого-нибудь предложения для этого?