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

using System.Collections.Generic;
using System.Web.Mvc;
using System.Web.Routing;namespace MvcApplication1.Controllers
{public class BaseController<TModel> : 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));}}//对哪些不需要依赖缓存的控制器 返回trueprivate bool NoNeedSessionController(RequestContext requestContext){//从路由数据中取到当前controller的名称var c = requestContext.RouteData.Values["controller"].ToString().ToLower();//把不需要依赖Session的控制器名称放到列表中var noNeedSessionList = new List<string>{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();}//登录的时候判断是否有Sessionprotected bool HasLoginSession(){return Session[loginSession] != null;}//判断购物车是否有Sessionprotected bool HasShoppingCartSession(){return Session[shoppingCartSession] != null;}//从Session中获取登录模型的实例protected TModel GetLoginModelFromSession(){return (TModel)this.Session[loginSession];}//从Session中获取购物车模型的实例protected TModel GetShoppingCartModelFromSession(){return (TModel)this.Session[shoppingCartSession];}//设置登录Sessionprotected void SetLoginSession(TModel loginModel){Session[loginSession] = loginModel;}//设置购物车Sessionprotected 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<LoginModel>{public ActionResult Index(){//把登录模型实例保存到Session中LoginModel loginModel = new LoginModel();SetLoginSession(loginModel);//从Session中获取登录模型实例LoginModel sessioModel = GetLoginModelFromSession();//使登录Session失效
            AbandonLoginSession();return View();}}
}

MVC在基控制器中实现处理Session的逻辑相关推荐

  1. asp.net MVC控制器中返回JSON格式的数据时提示下载

    Asp.net mvc在接收的是JSON格式的数据,但是奇怪的是在IE中提示下载文件,其他浏览器中一切正常,下载后,里面的内容就是在控制器中返回的数据.代码如下: 视图中js代码: $("# ...

  2. php中的控制器是什么意思,理解PHP中的MVC编程之控制器_php

    简单来讲,控制器的作用就是接受请求.它使用获取的方法,在这里是通过URI,载入一个功能模块来刷新或者提交一个表述层.控制器将使用$_GET自动全局变量来判断载入哪一个模块. 一个请求的例子,看起来像这 ...

  3. mvc 两个控制器session 丢失_用纯 JavaScript 撸一个 MVC 程序

    前言 我想用 model-view-controller 架构模式在纯 JavaScript 中写一个简单的程序,于是我这样做了.希望它可以帮你理解 MVC,因为当你刚开始接触它时,它是一个难以理解的 ...

  4. MVC控制器中动作方法返回的结果

    在MVC控制器中主要的返回方式有如下几种: 1.Content(): 返回文本类型的ContentResult,比如"这是我做的一个MVC". 2.File(): 返回文件类型的内 ...

  5. mvc 调用其他控制器方法session丢失_Java从入门到放弃;MVC 模式

    MVC 模式 MVC 模式是一种软件框架模式,被广泛应用在 JavaEE 项目的开发中.MVC 模式很好理解,但也十分重要,在今后的 Web 应用开发中,我们都离不开它. 之前,我们学习过了 Serv ...

  6. ASP .NET Core MVC 控制器中获取当前登录用户

    微软提供了 身份验证:Microsoft.AspNet.Identity 如果想要在控制器中获取当前登录的用户,如下代码: var userId = this.User.FindFirstValue( ...

  7. 在spring MVC项目中集成Spring session redis (使用spring session框架,redis作为存储缓存)...

    2019独角兽企业重金招聘Python工程师标准>>> 1.为项目增加以来  pom.xml中使用 <!-- spring session 单点登录 --> //本项目使 ...

  8. 在Spring MVC Web应用程序中添加社交登录:单元测试

    Spring Social 1.0具有spring-social-test模块,该模块为测试Connect实现和API绑定提供支持. 该模块已从Spring Social 1.1.0中删除,并由 Sp ...

  9. 如何使用recaptcha_在Spring MVC Web应用程序中使用reCaptcha

    如何使用recaptcha CAPTCHA是一个程序,可以生成人类可以通过但计算机程序" 不能 "通过的测试并对其进行评分. 所采取的策略之一是向用户显示具有扭曲文本的图像,并且用 ...

最新文章

  1. elasticsearch 分片_Elasticsearch最佳实践之分片使用优化
  2. 2021第一融!第四范式完成D轮7亿美元融资
  3. 监听端口的非阻塞性不具有继承性
  4. 使用R进行相关性分析
  5. 岳阳学计算机软件,岳阳学java专业学校排名
  6. element-ui upload组件 上传文件类型限制
  7. Ubuntu 手动更新firefox的flash插件
  8. 候选公示!高工智能汽车金球奖第二批入围年度产品/方案亮相
  9. ABB ACS 510 1.5-5.5kw驱动板图纸 PDF格式
  10. SpringMVC---- SpringMVC返回JSON数据
  11. 2020读书笔记 《马歇尔传记》
  12. python scrapy框架 抓取的图片路径打不开图片_Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码...
  13. 11 | 向埃隆·马斯克学习任务分解
  14. 服务器断电mysql文件丢失_服务器断电了怎么恢复数据?
  15. Java学习笔记【10】常用类 - - Math类、Random类及随机数详解
  16. python中 glob.glob
  17. matlab如何在极坐标绘图,Matlab在极坐标中绘图
  18. windows7安装打印机提示“本地打印后台处理程序服务没有运行”
  19. 77.Oozie的HA启用
  20. android studio各个资源文件夹以及作用备注

热门文章

  1. 利器:Sublime Text 要点记录
  2. 项目管理和产品管理绉议
  3. AngularJS $q 和 $q.all 单个数据源和多个数据源合并(promise的说明)
  4. grafana3.1.0安装配置
  5. Python日期操作
  6. 新建QQ群-欢迎加入
  7. js怎么获取一个元素与屏幕右边的距离_js获取元素到屏幕左上角的距离
  8. iangularjs 模板_AngularJS中的模板安全与作用域绑定
  9. eplan模板_EPLAN之3D箱柜清单自动生成
  10. python 获取网络图片的大小