【问题标题】:Session Variable is null after using RedirectToAction使用 RedirectToAction 后会话变量为空
【发布时间】:2019-09-26 21:07:46
【问题描述】:

在视图Edit.cshtml 中编辑信息后,我设置了一个会话变量Session["ToastMessage"] = "Sucessfully"; 以在再次加载后在Edit.cshtml 中显示它。但我在视图中看到了Session["ToastMessage"] = null

        // GET: About/Edit/
        public ActionResult Edit()
        {
            AboutInformation about = LoadDataFromConfigFile();
            return View(about);
        }

        // POST: About/Edit/
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind(Include = "NameApp,ContactInformation,Email,Fax,Phone,ReleaseDay,LogoPathOfProduction,IsShow,LatestVersion,ReleaseNotes")] AboutInformation about,List<string> imagesToDelete, List<HttpPostedFileBase> images, bool? isShowInfo)
        {
            if (ModelState.IsValid)
            {
                //update....
            }

            Session["ToastMessage"] = "Sucessfully";
            return RedirectToAction("Edit");
        }

尝试调试,刚刚传递给Get方法时显示Session["ToastMessage"] = null

  // GET: About/Edit/
            public ActionResult Edit()
            {
            }

会话以某种方式清晰,在我的应用程序中使用了很多会话,并且效果很好。 ASP 会在任何随机时间清除会话吗? 需要帮助!

【问题讨论】:

  • 您可以使用 TempData,如下面的答案所示。此外,您还可以使用它的 Keep 或 Peek 方法使其在其他操作方法中也可用。但我认为您不需要它,因为它是 Toast 消息。
  • 我认为 TempData 和 Session 都适用于这种情况。我已经尝试过 TempData,但它得到的 null 与我使用 Session 时相同。想知道是什么使值变为空。 @Sid
  • 你需要使用keep,因为这里是从一种方法到另一种操作方法。所以为此它会像: TempData.Keep("ToastMessage");返回之前在您的编辑方法中。然后在您的 Get 方法中再次阅读。

标签: c# asp.net-mvc


【解决方案1】:

对于您的情况,您可以使用TempData 而不是Session

TempData["ToastMessage"] = "Sucessfully";

TempData 可用于存储临时数据,可用于后续请求。

public ActionResult Edit()
        {
            var result = TempData["ToastMessage"];
            // check result here
            AboutInformation about = LoadDataFromConfigFile();
            return View(about);
        }

【讨论】:

  • 我认为 TempData 和 Session 都适用于这种情况。我已经尝试过 TempData,但它得到的 null 与我使用 Session 时相同。想知道是什么让值变为空。
【解决方案2】:

您可以在将一个 ActionMethod 重定向到另一个 Action 时使用 TempData。

var Status=TempData["ToastMessage"];

【讨论】:

    【解决方案3】:

    您可以使用@hien-nguyen answer 直接返回查看并显示 toast 消息。但是,在您的情况下,您正在重定向到另一个操作方法。 因此,您可以像这样使用临时数据的 Keep 方法:

    // POST: About/Edit/
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind(Include = "NameApp,ContactInformation,Email,Fax,Phone,ReleaseDay,LogoPathOfProduction,IsShow,LatestVersion,ReleaseNotes")] AboutInformation about,List<string> imagesToDelete, List<HttpPostedFileBase> images, bool? isShowInfo)
        {
            if (ModelState.IsValid)
            {
                //update....
            }
    
            TempData["ToastMessage"] = "Sucessfully";
            var message = TempData["ToastMessage"];
            TempData.Keep("ToastMessage");
            return RedirectToAction("Edit");
        }
    

    在Get方法中:

    public ActionResult Edit()
            {
                AboutInformation about = LoadDataFromConfigFile();
                var message = TempData["ToastMessage"];
                return View(about);
            }
    

    【讨论】:

    • 刚试了TempData.Keep,在Get方法中还是得到null。
    【解决方案4】:

    检查您的 localhost 浏览器 cookie 或您正在使用的任何服务器;他们不应该被阻止。允许 cookie。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 2014-03-24
    • 2011-09-03
    • 1970-01-01
    相关资源
    最近更新 更多