在“重定向”后,TempData的值变为空

本文关键字:重定向 TempData | 更新日期: 2023-09-27 18:05:07

我正面临TempDataRedirect之后的问题。

public ActionResult LoginCredentials()
{
    // Calling "SetError()" in catch(), if password mismatch.                        
    try{}
    catch()
    {
      return SetError();
    }   
}
public ActionResult SetError()
{
    // set the value of TempData as "true"                        
    TempData["error"] = true;
    return Redirect("/Login");                
}

public ActionResult Index()
{
    ViewData["useError"]= TempData["error"]; // at this point TempData["error"] is null.
    ...
}

在TempData的SetError()值成功设置为true,问题发生在"Redirect"之后,值变成"null",我不能再使用它了

在“重定向”后,TempData的值变为空

    services.Configure<CookiePolicyOptions>(options =>
    {
                    // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                    //options.CheckConsentNeeded = context => true;
                    options.MinimumSameSitePolicy = SameSiteMode.None;
    });
turn off options.CheckConsentNeeded = context => true; 

  1. 可能浏览器是无cookie的
  2. TempDataDictionary对象中的数据仅从一个请求持续到下一个请求,除非您使用Keep方法标记一个或多个键以保留,根据您的代码,如果您重定向到登录页面,然后重定向到索引,则值将为空。你只能在登录页面阅读。

我发现。net Core非常有问题。我必须在Configuration

中将其关闭
options.CheckConsentNeeded = context => true;

,当我使用重定向导航到另一个页面时,它工作了。

但是在刷新页面时,TempDate或ViewData会失去它们的值。但当我在"视图"中将它重新分配给自身时工作:

@{
TempData["somevalue"] = TempData["somevalue"];
}
使用RedirectToAction

public ActionResult SetError()
{
// set the value of TempData as "true"                        
   TempData["error"] = true;
   return RedirectToAction("YourViewName");                
 }

据我所知,ViewData仅在重定向后保存数据,而不是当另一个Http请求发生时。所以在Login方法(你重定向到)这个ViewData["useError"]必须是可用的,但Index方法只是在另一个http请求期间执行的另一个方法。这就是为什么ViewData["useError"]是空的
如果你想在不同的Http请求之间存储数据,可以使用Session

CookieTempDataProviderOptions中设置cookie为必需,为我解决了这个问题。

services.Configure<CookiePolicyOptions>(options =>
{
    // This lambda determines whether user consent for non-essential cookies is needed for a given request.
    options.CheckConsentNeeded = _ => true;
    options.MinimumSameSitePolicy = SameSiteMode.Strict;
});
services.Configure<CookieTempDataProviderOptions>(options =>
{
    options.Cookie.IsEssential = true;
});

更多信息:https://learn.microsoft.com/en us/dotnet/api/microsoft.aspnetcore.mvc.cookietempdataprovideroptions.cookie?view=aspnetcore - 7.0