使用 RedirectToAction 后会话变量为空

Posted

技术标签:

【中文标题】使用 RedirectToAction 后会话变量为空【英文标题】:Session Variable is null after using 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 方法中再次阅读。 【参考方案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。

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。 这并没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review

以上是关于使用 RedirectToAction 后会话变量为空的主要内容,如果未能解决你的问题,请参考以下文章

RedirectToAction 和 RedirectToRoute

MVC RedirectToAction 在 global.asax 中调用 Session_Start()

MVC - 使用 RedirectToAction() 传递数据

回发后的 MVC3 RedirectToAction

成功的 jquery ajax 发布后 RedirectToAction 不起作用? [复制]

ASP.NET-RedirectToAction只能使用get方法