MVC在基控制器中实现处理Session的逻辑
当需要跨页面共享信息的时候,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));
}
} //对哪些不需要依赖缓存的控制器 返回true
private 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();
} //登录的时候判断是否有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<LoginModel>
{
public ActionResult Index()
{
//把登录模型实例保存到Session中
LoginModel loginModel = new LoginModel();
SetLoginSession(loginModel); //从Session中获取登录模型实例
LoginModel sessioModel = GetLoginModelFromSession(); //使登录Session失效
AbandonLoginSession();
return View();
} }
}
MVC在基控制器中实现处理Session的逻辑的更多相关文章
- MVC Controller 基类中的Request
今天在测试自己MVC程序的时候发现之前写代码的一个BUG,需求是每个页面要获取当前URL链接中包含的城市ID,我把获取url的方法写到了Controller的基类BaseController(Base ...
- asp.net MVC 在Controller控制器中实现验证码输出
asp.net mvc项目使用到验证码,为了让以前的WebForm代码能利用上代码经过稍微的改动即可使用代码如下: using System; using System.Collections.Gen ...
- ASP.NET MVC下实现前端视图页的Session
在ASP.NET MVC的控制器中可以实现Session处理.如果要在前端视图页实现Session该如何做呢?可以使用window.sessionStorage来做. AlexChittock用jQu ...
- MVC 在控制器中获取某个视图动态的HTML代码
ASP.NET MVC 在控制器中获取某个视图动态的HTML代码 如果我们需要动态的用AJAX从服务器端获取HTML代码,拼接字符串是一种不好的方式,所以我们将HTML代码写在cshtml文件中, ...
- asp.net MVC控制器中返回JSON格式的数据时提示下载
Asp.net mvc在接收的是JSON格式的数据,但是奇怪的是在IE中提示下载文件,其他浏览器中一切正常,下载后,里面的内容就是在控制器中返回的数据.代码如下: 视图中js代码: $("# ...
- ASP.NET MVC 中将数据从View传递到控制器中的三种方法(表单数据绑定)
http://www.cnblogs.com/zyqgold/archive/2010/11/22/1884779.html 在ASP.NET MVC框架中,将视图中的数据传递到控制器中,主要通过发送 ...
- ASP.NET在MVC控制器中获取Form表单值的方法
在网站开发中我们经常需要用到表单,那么,在前台页面的表单中提交到后台控制器后,后台控制器如何接收表单提交过来的数据呢?下面我们介绍几种常用的方法. 我们先看看前台页面,这里我们用一个用户名和密码的表单 ...
- 在ASP.NET MVC控制器中获取链接中的路由数据
在ASP.NET MVC中,在链接中附加路由数据有2种方式.一种是把路由数据放在匿名对象中传递: <a href="@Url.Action("GetRouteData&quo ...
- MVC教程二:从控制器中获取URL的值
一.从控制器中获取URL的值有三种方式: 1.使用Request.QueryString[] 例如: string value = Request.QueryString["BookId&q ...
随机推荐
- type Iterator does not take parameters
在ubuntu编译java程序时报错:type Iterator does not take parameters 源码如下: package object; import java.util.*; ...
- python软件依赖关系
caffe:numpy,scikit-image opencv:numpy
- Inno setup 常用修改技巧
Inno setup 常用修改技巧1 .如何让协议许可页面默认选中我同意按钮 [code]procedure InitializeWizard();beginWizardForm.LICENSEACC ...
- centos7.3 chrome 安装
/etc/yum.repos.d/目录下新建文件google-chrome.repo,向其中添加如下内容: [google-chrome] name=google-chrome baseurl=htt ...
- 两种方法设置nginx并发限制下面的白名单策略
前言: 今天,公司主站突然出现IDE创建应用没反应的问题,经过预发布环境.非代理环境下面的服务测试,均没有问题,定位问题出现在前端.而我们前端有两层代理,一是青松抗D系统,一是我们自己的nginx代理 ...
- Educational Codeforces Round 44 (Rated for Div. 2) F - Isomorphic Strings
F - Isomorphic Strings 题目大意:给你一个长度为n 由小写字母组成的字符串,有m个询问, 每个询问给你两个区间, 问你xi,yi能不能形成映射关系. 思路:这个题意好难懂啊... ...
- Ionic实战二:购物车
用户名密码都为空 此app功能主要有如下 1.首页轮播和商品列表展示 2.左侧侧滑页面分类展示 3.商品详情页面展示 以及购买 4.购物车 订单填写 支付等页面          
- tomcat+serlet+eclipse环境按键
---恢复内容开始--- 1. tomcat环境搭建 安装向导:http://www.runoob.com/jsp/eclipse-jsp.html 1. tomcat启动一闪而过,需要配置 JAVA ...
- ES6-const注意
注意要点 const 如何做到变量在声明初始化之后不允许改变的?其实 const 其实保证的不是变量的值不变,而是保证变量指向的内存地址所保存的数据不允许改动.此时,你可能已经想到,简单类型和复合类型 ...
- vue 单向数据流 & 双向绑定
在react中是单向数据绑定,而在vue中的特色是双向数据绑定.但是其实就我个人的理解是: 其实无论是vue还是react其实还是提倡单向数据流去管理状态,这一点在vuex和redux状态管理器上体现 ...