web-dev-qa-db-ja.com

アクションにリダイレクトし、データを渡す必要がある

問題に固有の3つのアクションを処理するコントローラーがあります。

1つ目は、ユーザーが指定されたアイテムのプロパティを編集できるHTMLフォームを含むビューを返す編集アクションです。

2番目は、ブラウザからのポストバックを受け入れ、データベースを更新する更新アクションです。更新が成功すると、アクションへのリダイレクトを行います。

3番目は、指定されたアイテムの詳細を表示するshowアクションです。このアクションは、更新が成功した後にリダイレクトされる場所です。

フローは次のとおりです。

表示->編集->更新(成功:y->表示にリダイレクト、n->戻り編集)

達成したいのは、更新が成功したときにフラグを作動させて、次の表示ビューでユーザーに確認メッセージを表示できるようにすることです。問題は、RedirectToAction()呼び出しでそのデータを運ぶ最良の方法が100%確信できないことです。私はクエリ文字列を使用していたと思っていましたか?別の目的のためにクエリ文字列とともに変数を既に持ち歩いていますが、私の一部はそれを悪用することに懐疑的です。リダイレクトの呼び出しは次のとおりです。

RouteValueDictionary dict = Foo.GetRouteValues(bar);

RedirectToAction("Show", dict);

私もこの質問を読みましたが、必要がない場合はTempDataプロパティを使用することを心配しています。

質問

いくつかの提案をありがとう!

28
user172632

編集:申し訳ありませんが、もともとTempDataを使用したくないというあなたのメモを見ていませんでした。

一言で言えば-クライアントがリダイレクトされたページを更新/リロードした場合、メッセージを再表示しますか?

使用する場合は、次のようなクエリ文字列を使用します。

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

そして次に定義する

public ActionResult Index(string message) { }

または、明示的にRequest.QueryString ["message"]を引き出し、通常の方法でViewDataを介してViewに渡します。これは、サイトからのCookieを受け入れないブラウザーでも機能します。

メッセージを再び表示したくない場合は、ASP.NET MVC 1.0がこの正確な目的のためにTempDataコレクションを提供します。

TempDataプロパティ値は、同じブラウザからの次のリクエストまでまでセッション状態で保存されます、その後クリアされます-したがって、RedirectToActionを返す直前にTempDataに何かを入れると、リダイレクトの結果で利用可能ですが、その後すぐにクリアされます。

ASP.NET MVCスタートアッププロジェクトのHomeControllerへの簡単な変更を次に示します。

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
Dylan Beattie

TempDataのファンでもなかったうえ、見たくなかったので、URLに成功フラグを渡したくなかった

App/Settings?saveSuccess = true

ブラウザの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アクションで、この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 ブールフラグよりも複雑なものを渡し始めると、これはかなり滑りやすい勾配になります

4
wal