Перенаправление к действию и потребности передать данные

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

Первым является действие редактирования, которое возвращает представление с HTML-формой, что пользователь может отредактировать свойства на данном объекте.

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

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

Поток:

Покажите-> Редактирование-> Обновление (Sucess: y-> перенаправляют для Показа, n-> Редактирование возврата),

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

RouteValueDictionary dict = Foo.GetRouteValues(bar);

RedirectToAction("Show", dict);

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

Вопрос

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

28
задан Community 23 May 2017 в 12:25
поделиться

1 ответ

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

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

Если да, то используйте строку запроса, что-то вроде:

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 должно содержать что-то вроде этого:

<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
  <% if (TempData["message"] != null) { %>
    <p><%= Html.Encode(TempData["message"]) %></p>
  <% } %>
  <% using (Html.BeginForm()) { %>
    <input type="submit" name="submitButton" value="Button One" />
    <input type="submit" name="submitButton" value="Button Two" />
  <% } %>
</asp:Content>

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

Обратите внимание, что это поведение изменилось в ASP.NET MVC 2 - дополнительную информацию см. в разделе "Передача состояния между методами действий" в этой статье.

41
ответ дан 28 November 2019 в 03:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: