问题由来:
在自己搭建的系统(ASP.NET Core MVC)中发现一处用Url传消息到前台的地方,WC我怎么写了这个代码?要是随便传到前台消息可以出现N种自定义消息。零容忍,思索一番回归原始解决办法。
一般用到的传值:
- ViewData
- ViewBag
- ViewModel
- TempData
- ......
用哪个传值?
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