У меня есть контроллер, который обрабатывает три действия, которые характерны для моей проблемы.
Первым является действие редактирования, которое возвращает представление с HTML-формой, что пользователь может отредактировать свойства на данном объекте.
Вторым является действие обновления, которое признает, что сообщение назад формирует браузер, и обновляет базу данных. Когда обновление успешно, мы делаем перенаправление к действию.
Третьим является выставочное действие, которое показывает детали данного объекта. Это действие состоит в том, где мы перенаправляемся к после успешного обновления.
Поток:
Покажите-> Редактирование-> Обновление (Sucess: y-> перенаправляют для Показа, n-> Редактирование возврата),
То, чего я хочу достигнуть, должно иметь флаг, смещенный, когда обновление было успешно так, чтобы на следующем представлении Show я мог отобразить сообщение с подтверждением для пользователя. Проблема состоит в том, что я не на 100% уверен в лучшем способе нести те данные по RedirectToAction () вызов. Одна мысль у меня было действительно ли использование, была строкой запроса? Мы уже несем переменные вокруг со строкой запроса для другой цели, но часть моего скептически настроена для злоупотребления этим. Вызов к перенаправлению ниже.
RouteValueDictionary dict = Foo.GetRouteValues(bar);
RedirectToAction("Show", dict);
Я считал этот вопрос также, но хитро об использовании свойства TempData, если я не имею к.
Спасибо за некоторые предложения!
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 - дополнительную информацию см. в разделе "Передача состояния между методами действий" в этой статье.