博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MVC在基控制器中实现处理Session的逻辑
阅读量:5273 次
发布时间:2019-06-14

本文共 3682 字,大约阅读时间需要 12 分钟。

当需要跨页面共享信息的时候,Session是首当其冲的选择,最典型的例子就是:在处理登录和购物车逻辑的时候需要用到Session。在MVC中,可以把处理Session的逻辑放在一个泛型基控制器中,但需要注意的是:在判断没有登录就跳转到登录页的时候,需要把出错控制器和登录控制器排除在外。

using System.Collections.Generic;using System.Web.Mvc;using System.Web.Routing;namespace MvcApplication1.Controllers{    public class BaseController
: Controller { private const string loginSession = "LoginSession"; private const string shoppingCartSession = "ShoppingCartSession"; private const string errorController = "Error"; private const string LoginController = "Login"; private const string LoginAction = "Login"; //没有登录的跳转到登录页 protected override void Initialize(RequestContext requestContext) { base.Initialize(requestContext); //如果没有登录,且不是出错和登录控制器就跳转到登录页 if (!NoNeedSessionController(requestContext) && !HasLoginSession()) { GoToAction(requestContext, Url.Action(LoginAction, LoginController)); } } //对哪些不需要依赖缓存的控制器 返回true private bool NoNeedSessionController(RequestContext requestContext) { //从路由数据中取到当前controller的名称 var c = requestContext.RouteData.Values["controller"].ToString().ToLower(); //把不需要依赖Session的控制器名称放到列表中 var noNeedSessionList = new List
{ errorController.ToLower(), LoginController.ToLower() }; return noNeedSessionList.Contains(c); } //跳转到某个视图 private void GoToAction(RequestContext requestContext, string action) { requestContext.HttpContext.Response.Clear(); requestContext.HttpContext.Response.Redirect(action); requestContext.HttpContext.Response.End(); } //登录的时候判断是否有Session protected bool HasLoginSession() { return Session[loginSession] != null; } //判断购物车是否有Session protected bool HasShoppingCartSession() { return Session[shoppingCartSession] != null; } //从Session中获取登录模型的实例 protected TModel GetLoginModelFromSession() { return (TModel)this.Session[loginSession]; } //从Session中获取购物车模型的实例 protected TModel GetShoppingCartModelFromSession() { return (TModel)this.Session[shoppingCartSession]; } //设置登录Session protected void SetLoginSession(TModel loginModel) { Session[loginSession] = loginModel; } //设置购物车Session protected void SetShoppingCartSession(TModel shoppingCartModel) { Session[shoppingCartSession] = shoppingCartModel; } //让登录Session失效 protected void AbandonLoginSession() { if (HasLoginSession()) { Session.Abandon(); } } //让购物车Session失效 protected void AbandonShoppingCartSession() { if (HasShoppingCartSession()) { Session.Abandon(); } } }}

让其他控制器派生于基控制器:

using System.Web.Mvc;using MvcApplication1.Models;namespace MvcApplication1.Controllers{    public class LoginController : BaseController
{ public ActionResult Index() { //把登录模型实例保存到Session中 LoginModel loginModel = new LoginModel(); SetLoginSession(loginModel); //从Session中获取登录模型实例 LoginModel sessioModel = GetLoginModelFromSession(); //使登录Session失效 AbandonLoginSession(); return View(); } }}

转载于:https://www.cnblogs.com/darrenji/p/3819225.html

你可能感兴趣的文章
【转】经验分享:大型高并发高负载网站的系统架构
查看>>
HDU 6060 RXD and dividing (求贡献)
查看>>
java中 immutable,future,nio
查看>>
VMware ESX常用命令
查看>>
golang三方包应该如何安装--在线和离线
查看>>
选择排序
查看>>
鼠标移入移出透明度变化效果
查看>>
我工作这十年-世界在变化
查看>>
log4j2 不使用配置文件,动态生成logger对象
查看>>
[IOI2014]holiday假期(分治+主席树)
查看>>
python的上下文管理(contextlib)(2)
查看>>
mysql安装
查看>>
运算符有感
查看>>
设置dataGridView单元格颜色、字体、ToolTip、字体颜色
查看>>
wx-charts 微信小程序图表 -- radarChart C# .net .ashx 测试
查看>>
对项目重命名
查看>>
Scrapy框架简介及小项目应用
查看>>
tkinter学习三
查看>>
CentOS自带定时任务crontab
查看>>
基因组拼接中常见的名词解释
查看>>