ASP.NETCore中使用TempData为null的原因及方法

4 篇文章 0 订阅
4 篇文章 0 订阅

 

问题由来:

在自己搭建的系统(ASP.NET Core MVC)中发现一处用Url传消息到前台的地方,WC我怎么写了这个代码?要是随便传到前台消息可以出现N种自定义消息。零容忍,思索一番回归原始解决办法。

一般用到的传值:

  1. ViewData 
  2. ViewBag
  3. ViewModel
  4. TempData
  5. ......

用哪个传值?

ViewData与ViewBag虽然都可以传值,但是只用在当前Controller里面,重定向之后数据没法保留,TempData可以跨视图保存我们需要的信息;它默认是只能使用一次,不过也可以通过扩展方法实现持久保存。不推荐这种用法。不过当然,有它的存在就一定有应用场景。我这里刚好是只用TempData保存错误消息~

实现

登录错误调用这个错误方法跳到首页:

    public IActionResult GoError()

{

   TempData["Messages"] = "登录失败!";

   return RedirectToAction("Index","Home");

}

然后首页控制器方法:

var msgdata = TempData["Messages"];

 if (TempData["Messages"]!=null)

 {

    ViewData["msg"] = TempData["Messages"].ToString();

 }

 return View();

 

好了 到这里出现我们主要问题了。这个方法内获取TempData["Messages"];总是为 NULL 值。粗略看了下官网解释,会话状态需要配置。题外话如下

会话状态是一种可以追溯到ASP.NET(非核心)的功能,你可以使用它为浏览站点的用户存储和检索服务器端的值。 会话状态经常在ASP.NET应用程序中广泛使用,但经常由于一些原因而出现问题,主要是性能和可伸缩性

ASP.NET Core中的你应该把会话状态看作针对每用户的缓存。 从技术角度来看,ASP.NET Core中的会话状态的功能需要2个独立的部分来完成:

  • 一个Cookie。 用来指定每个用户的唯一ID(Session ID)
  • 一个分布式缓存。用来存储与每个用户唯一ID关联的数据项

在一般的情况下,我会尽量避免使用会话状态,使用会话状态可能会有很多陷阱,如果不注意,就会引起一起不必要的问题。例如:

  • 会话是针对每个浏览器的,而不是每个登录用户的
  • 会话结束的时候,应该删除会话Cookie,但可能不会
  • 如果会话中没有任何值,它将会被删除,并重新生成一个新的会话ID
  • GDPR问题(通用数据保护规范)

尤其注意这个通用数据保护法规,只要用户不接受你的cookie,将无法在站点中设置cookie

所以我们可以想到第一个就是程序Cookies策略方法,关于这个貌似在stackoverflow上面还有国内博客园上看到了回答:

Solution-A:

在net core 2.1版本之后可以尝试把Startup.Configure()app.UseCookiePolicy(); 应该在app.UseMVC()之后;

经过实验是可以的,感觉这个办法有点违背系统设计~

还是看官方文档:

Solution-B:

安照官方配置走!  安照官方配置走!  安照官方配置走!

第一步就是把那个弹出cookie同意使用的功能禁用了

第二步然后标记会话cookie是必要的;

使用这种方法,虽然应用程序依然会显示Cookie同意横幅,并且在点击之前不会写入非必要的Cookie。 但会议状态将在用户同意Cookie之前立即生效,因为它被认为是必要的;

核心配置如下

public void ConfigureServices(IServiceCollection services){

    services.Configure<CookiePolicyOptions>(options =>    {

        options.CheckConsentNeeded = context => true;

        options.MinimumSameSitePolicy = SameSiteMode.None;

    });

    services.AddSession(opts =>     {

        opts.Cookie.IsEssential = true;

    });

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

}

有问题可以私聊我或者发邮件:1015380326@qq.com  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值