Перенаправление на действие и необходимость передачи данных

У меня есть controller, который обрабатывает три действия, характерные для моей проблемы.

Первое – это действие редактирования, которое возвращает представление с формой HTML, которое пользователь может редактировать свойства для данного элемента.

Во-вторых, это действие обновления, которое принимает сообщение назад в браузере и обновляет базу данных. Когда обновление выполнено успешно, мы делаем redirect на действие.

Третий – это действие шоу, которое показывает детали данного элемента. Это действие происходит, когда мы перенаправляемся после успешного обновления.

Поток:

Показать -> Изменить -> Обновить (Sucess: y -> перенаправить на Show, n -> return Edit)

Я хочу добиться того, чтобы флаг был сработал, когда обновление было успешным, так что на следующем экране «Показать» я могу отобразить сообщение для пользователя. Проблема в том, что я не уверен на 100% наилучшим образом переносить эти данные по вызову RedirectToAction (). Я думал, что я использовал строку запроса? Мы уже несем переменные вокруг строки запроса для другой цели, но часть моего скептически относится к злоупотреблениям. Вызов перенаправления указан ниже.

RouteValueDictionary dict = Foo.GetRouteValues(bar); RedirectToAction("Show", dict); 

Я тоже прочитал этот вопрос, но я не знаю, как использовать свойство TempData, если мне это не нужно.

Вопрос

Спасибо за некоторые предложения!

EDIT: Извините, изначально не видел вашей заметки о том, что вы не хотите использовать TempData.

Вкратце – вы хотите, чтобы ваше сообщение снова появилось, если клиент обновляет / перезагружает страницу, на которую они перенаправлены?

Если вы это сделаете, используйте функцию querystring, например:

 return(RedirectToAction("Index", new { message = "hi there!" })); 

а затем либо определить

 public ActionResult Index(string message) { } 

или явно вытащить Request.QueryString [“message”] и передать его в View через ViewData обычным способом. Это также будет работать на браузерах, которые не принимают cookies с вашего сайта.

Если вы НЕ хотите, чтобы сообщение отображалось снова, ASP.NET MVC 1.0 предоставляет коллекцию TempData для этой конкретной цели.

Значения свойств TempData хранятся в состоянии сеанса до следующего запроса из того же браузера , после которого они очищаются – поэтому, если вы поместите что-то в TempData непосредственно перед возвратом RedirectToAction, оно будет доступно по результату перенаправления, но будет очищено сразу после этого.

Вот простое изменение в HomeController в проекте запуска ASP.NET MVC:

 public ActionResult Index() { ViewData["Message"] = "Welcome to ASP.NET MVC!"; return View(); } [AcceptVerbs(HttpVerbs.Post)] public ActionResult Index(string submitButton) { TempData["message"] = "You clicked " + submitButton; return(RedirectToAction("Index")); } public ActionResult About() { return View(); } 

и соответствующий вид /Views/Home/Index.aspx должен содержать примерно следующее:

  <% if (TempData["message"] != null) { %> 

<%= Html.Encode(TempData["message"]) %>

<% } %> <% using (Html.BeginForm()) { %> <% } %>

Вы заметите, что сообщение TempData отображается сразу после последовательности POST-REDIRECT-GET, но если вы обновите страницу, она не будет отображаться снова.

Обратите внимание, что это поведение изменилось в ASP.NET MVC 2 – см. «Состояние передачи между методами действий» в этой статье для получения дополнительной информации.

Никогда не был поклонником TempData и, кроме того, я не хотел передавать флаг успеха в URL-адрес, поскольку я не хотел видеть

App / Настройки? SaveSuccess = Истинные

в строке URL браузера.

В моем решении используется временный файл cookie:

 [HttpPost] public ActionResult Settings(SettingsViewModel view) { if (ModelState.IsValid) { //save Response.SetCookie(new HttpCookie("SettingsSaveSuccess", "")); return RedirectToAction("Settings"); } else { return View(view); } } 

и в соответствующей проверке Get action для присутствия этого Cookie и удалите его:

 [HttpGet] public ActionResult Settings() { var view = new SettingsViewModel(); //fetch from db and do your mapping bool saveSuccess = false; if (Request.Cookies["SettingsSaveSuccess"] != null) { Response.SetCookie(new HttpCookie("SettingsSaveSuccess", "") { Expires = DateTime.Now.AddDays(-1) }); saveSuccess = true; } view.SaveSuccess = saveSuccess; return View(view); } 

nb это может быть довольно скользкий наклон, если вы начинаете передавать что-либо более сложное, чем логический флаг

Давайте будем гением компьютера.