リダイレクトの前にViewbagを設定する


122

ViewBagリダイレクトを呼び出す前にを設定することは可能ですか?

私は次のようなものが欲しい:

@ViewBag.Message="MyMessage";
RedirectToAction("MyAction");

回答:


242

あなたがリダイレクトを使用するときは、使用してはならないViewBagが、TempData

public ActionResult Action1 () {
 TempData["shortMessage"] = "MyMessage";
 return RedirectToAction("Action2");
}

public ActionResult Action2 () {
 //now I can populate my ViewBag (if I want to) with the TempData["shortMessage"] content
  ViewBag.Message = TempData["shortMessage"].ToString();
  return View();
}

1
ビューにいない場合、なぜ@ViewBagがあるのですか?
apkisbossin

6
私はそれを使用していて、TempDataが何らかの理由で空であるという小さな問題に直面したので、答えを完成させたいと思います(私の場合、変換が行われたときにのみメッセージが表示されます)。したがって、エラーを回避するためにテストif(TempData ["Message"]!= null)が必要でした。
Patrick

1
リダイレクトが他のコントローラーへの場合はどうなりますか?他のコントローラーのアクションでは、ViewBag、TempData、Sessionはすべて空です!
Andrew

1
@Andrewよく、TempDataは特定のコントローラーに関連していません。多分あなたは複数のリダイレクトを行い、TempDataを失いますか?あなたは...いくつかのコードで新しい質問にリンクすることができます
ラファエルAlthaus

フィルター属性のOnAuthorizeメソッドでそれらを設定しようとしましたが、何も機能しなかったため、クエリ文字列を使用してデータを渡しました。逆に言うと、コントローラーでTempDataを設定すると、後でフィルター属性で読み取る必要が生じたときに機能しました。ありがとう!
Andrew

13

この状況ではTempDataを使用できます。 ここでは、ViewBag、ViewData、およびTempDataについて説明します。


8

私はこれが好きでした、そしてそれが私のために働いていました...ここでパスワードを変更しています。成功したら、成功メッセージをビューバッグに設定してビューに表示したいと思います。

    public ActionResult ChangePass()
    {
        ChangePassword CP = new ChangePassword();
        if (TempData["status"] != null)
        {
            ViewBag.Status = "Success";
            TempData.Remove("status");
        }
        return View(CP);
    }

    [HttpPost]
    public ActionResult ChangePass(ChangePassword obj)
    {
        if (ModelState.IsValid)
        {
            int pid = Session.GetDataFromSession<int>("ssnPersonnelID");
            PersonnelMaster PM = db.PersonnelMasters.SingleOrDefault(x => x.PersonnelID == pid);

            PM.Password = obj.NewPassword;
            PM.Mdate = DateTime.Now;
            db.SaveChanges();

            TempData["status"] = "Success";
            return RedirectToAction("ChangePass");
        }

        return View(obj);
    }

3

ここから撮影

概要

ViewDataオブジェクトとViewBagオブジェクトを使用すると、モデルの横にある追加のデータにアクセスできますが、より複雑なデータの場合は、ViewModelに移動できます。一方、TempDataはHTTPリダイレクトのデータを操作するために特別に用意されているため、TempDataを使用するときは注意が必要です。


-2

または、代わりにSessionを使用できます。

Session["message"] = "MyMessage";
RedirectToAction("MyAction");

そして、必要なときにいつでもそれを呼び出します。

更新

また、@ Jamesが彼のコメントで述べたように、不要なジャンクデータや古い値を回避するために、使用した後、その特定のセッションの値を無効またはクリアしても安全です。


4
私はそれに同意しません。これにはセッションを使用しないでください。
Mahmoodvcs 14

2
それは代替手段です。特定の状況ではそれが望ましいです。
csharpforevermore 2015年

セッション変数は、複数の投稿/取得の間で追跡する必要があるものに役立ちます。このような1回限りの使用の場合、クリアすることを忘れないでください。そうしないと、後でジャンクデータになり、一部の画面に不要に表示されたり、ロジックがコンテキスト外でトリガーされたりします。
James

@Jamesまさに、それは私がこのアプローチを使用する必要があるいくつかのケースで私がすることです。このような場合、使用後にその値を無効にするかクリアする必要があります。
Jon P
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.