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的逻辑

时间: 2024-10-19 22:15:05

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

ASP.NET MVC 中将数据从View传递到控制器中的三种方法(表单数据绑定)

转自:http://www.cnblogs.com/zyqgold/archive/2010/11/22/1884779.html 在ASP.NET MVC框架中,将视图中的数据传递到控制器中,主要通过发送表单实现的.具体使用中,主要使用以下三种方法. 1.通过Request.Form读取表单数据        2.通过FormCollection读取表单数据        3.直接读取表单数据对象 下边是我学习这些东西时的一点总结 1.通过Request.Form读取表单数据      首先定

在ASP.NET MVC控制器中获取链接中的路由数据

在ASP.NET MVC中,在链接中附加路由数据有2种方式.一种是把路由数据放在匿名对象中传递: <a href="@Url.Action("GetRouteData","Home",new { ReturnUrl = Request.Url.PathAndQuery, x = 10})">走你</a> 一种是放在RouteValueDictionary对象中传递: <a href="@Url.Action

ASP.NET在MVC控制器中获取Form表单值的方法

在网站开发中我们经常需要用到表单,那么,在前台页面的表单中提交到后台控制器后,后台控制器如何接收表单提交过来的数据呢?下面我们介绍几种常用的方法. 我们先看看前台页面,这里我们用一个用户名和密码的表单来作为前台页面. 首先,我们新建一个MVC项目,然后添加一个控制器,UserInfoController:在控制器的默认方法index中,我们添加一个视图.这个index视图用来显示我们的前台注册页面. 视图如下:即使一个简单的表单~ 代码如下,视图的关键点就是把表单内容提交到哪个控制器的那个方法.

ASP.NET MVC 表单提交多层子级实体集合数据到控制器中

于遇到了项目中实体类嵌套多层子级实体集合,并且子级实体集合的数据需要提交保存到数据库中的问题.针对此情况需要进行一些特殊的处理才可以将整个 实体类及子级实体集合数据提交表单到控制器中,解决的方法是根据MVC视图中表单的命名规则来设置正确的子级实体集合所属的表单控件name属性,从而来 获取提交的集合数据. 在说明如何将表单中实体的子级实体集合数据提交到控制器中的问题前,我们需要了解MVC的对于数组和列表集合的表单提交方式(点击此链接进行查看). 定义多层嵌套实体和假设场景 首先我们根据情况进行分

[asp.net mvc] 将视图中的表单数据传递到控制器中

在ASP.NET MVC框架中,将视图中的数据传递到控制器中,主要通过发送表单实现的.具体使用中,主要使用以下三种方法. 1.通过Request.Form读取表单数据 表单代码: 1 @using (Html.BeginForm("Person", "Default3")) 2 { 3 @Html.TextBox("tFirstName") 4 <br /> 5 @Html.TextBox("tLastName")

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

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

Asp.net mvc 中处理同一个session的并行请求的问题

首先来一个小的asp.net mvc 4的sample,代码如下: HomeController: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.SessionState; namespace MvcApplication2.Controllers { public class HomeContr

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

在MVC控制器中主要的返回方式有如下几种: 1.Content(): 返回文本类型的ContentResult,比如"这是我做的一个MVC". 2.File(): 返回文件类型的内容FileResult,比如PDF 3.HttpNotFound(): 返回包含404HTTP状态码的HttpNotFoundResult. 4.JavaScript(): 返回包含JavaScript内容的JavaScriptResult,比如"function hello(){alert(Hel

在IE中MVC控制器中返回JSON格式的数据时提示下载

最近做项目时,视图中用jquery.form.js异步提交表单时,接收的是JSON格式的数据,但是奇怪的是在IE中提示下载文件,其他浏览器中一切正常,下载后,里面的内容就是在控制器中返回的数据.代码如下: 视图中js代码: $("#formDoUpload").ajaxSubmit({                    type: "POST",                    url: "/controller/action/",