目录

介绍

使用Filter方式

Filter在MVC生命周期中的位置

Filter常见的应用场景

Filter的执行顺序

MVC中常见的对Session,Cookie的依赖

使用Filter解除依赖

使用Model Binding方式

什么是Model Binding?

自定义Model Binding

总结


介绍

本文将分别介绍在MVC中使用Filter和Model Binding两种方式来说明如何解除对Session,Cookie等的依赖。当然也会适当对Filter在MVC请求的生命周期中的作用和角色,使用场景等作下简单的说明。

使用Filter方式

Filter在MVC生命周期中的位置

如上图所示,一个完成的MVC的生命周期分为5个步骤, 对应图例中的1~5。

  1. IIS中传递请求到程序
  2. MVC根据Routing来选择由哪个Controller/Action来处理
  3. Controller调用Model(业务逻辑)来处理数据
  4. Controller选择一个View, 同时把需要呈现的数据交给View Engine呈现
  5. 最后,返回最终的Response到客户端

Filter在MVC的生命周期中的角色就像是一个一个的截面,在MVC的处理过程中,拦截请求。

Filter分为:

Authorization filters——需要实现IAuthorizationFilter接口,用于验证处理验证相关的操作

Action filters——需要实现IActionFilter接口. 在Action处理的开始和结束做拦截操作

Result filters——需要实现IResultFilter接口. 在View呈现前和呈现后做处理

Exception filters——需要实现IExceptionFilter接口,只要是添加了Exception Filter的请求中出现异常,都会被拦截

每个Filter的作用时机,对应于上图中的2a, 2b, 4a, 4b。

Filter常见的应用场景

下面是个人在开发中,常用到的Filter处理:

  • 权限验证

使用Authorization filters,拦截请求,在进入到Controller处理之前,验证用户是否登录或者登录用户是否有权限访问改页面。

如果合法,就继续交由Controller处理,如果非法,中断流程,跳转到登录页面。

  • 日志记录

通过Action Filter跟踪记录Action处理开始的时间,结束时间,访问的具体Controller和Action, 参数,访问者ip等信息。

  • 异常处理

异常处理Exception filter能够在发生异常的时候,记录异常信息。如果是session过期引起的异常,则跳转到登录页面,如果是程序运行导致的无法处理异常,则跳转到友好的错误页面。

  • 提升SEO效果

每篇博客文章的meta信息能够帮助提高SEO效果,但是很多人对于填写keyword, description等信息觉得太繁琐。

可以使用Result filters,在最后呈现页面前,使用程序分析内容,提取keyword和description来,然后填充到meta信息中。

这样,每篇博客文章都能够有程序实现最佳的SEO效果,甚至生成一份SEO报告出来。

Filter的执行顺序

Filter之间执行的顺序,首先根据类型区分:

分别是Authorization filters, Action filters, Result filtersException Filter没有列入的原因是, 它是在发生异常的时候处理,没有特定的顺序。

当同时对一个类型的Filter的时候,执行顺序可以通过Filter的Order属性来排序。

MVC中常见的对Session,Cookie的依赖

在Web程序中,对于Session和Cookie等的使用是必不可少的。比如, 很多的Action的代码中,会要从Session中获取当前登录用户信息:

public ActionResult Index()
{var user = Session[“UserAccuont”];//从Session中获取当前登录用户的信息//send emailvar email = user.Email;…………
}

上面的Index方法的问题就是和Session耦合,很难单元测试。下面介绍如何使用Filter来解除对于Session的依赖。

使用Filter解除依赖

添加一个SessionUserParameterAttribute的Action Filter, 它的功能是:

从Session中取得User, 将取得的User赋值给Action中的参数sessionUser。

public class SessionUserParameterAttribute : ActionFilterAttribute
{public override void OnActionExecuting(ActionExecutingContext filterContext){const string key = "sessionUser";if (filterContext.ActionParameters.ContainsKey(key)){filterContext.ActionParameters[key] = Session[“UserAccuont”];//为Action设置参数}base.OnActionExecuting(filterContext);}
}

改造后的Index Action方法如下:

[SessionUserParameter]
public ActionResult Index(UserAccount sessionUser)
{//send emailvar email = sessionUser.Email;…………
}

这样Index方法就解除了对于Session的依赖,而只是依赖于一个普通的实体类UserAccount。在单元测试中,只需要简单的构造一个UserAccount的对象就可以了。

使用Model Binding方式

什么是Model Binding?

Model Binding的作用就是将Request请求中包含的散乱参数,根据接受请求的Action方法的参数列表,自动智能地构建这些参数的过程。

自定义Model Binding

继承接口IModelBinder, 实现BindModel方法。

这个UserAccountModelBinder的作用就是从Session中取得UserAccount。(问题和Filter中提到的问题相同)

   public class UserAccountModelBinder : IModelBinder{public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext){if(controllerContext.HttpContext.Session["UserAccuont"] != null){return controllerContext.HttpContext.Session["UserAccuont"];}return null;}}

接下来,我们要为这个ModelBinder,添加到MVC的Model Binding设置中,使得它能够在MVC的生命周期中起作用。

在Global.asax.cs文件的Application_Start()方法中,添加UserAccountModelBinder。

protected void Application_Start()
{………//凡是UserAccount类型的参数,都会使用UserAccountModelBinder来处理,也就是会从Session中取值ModelBinders.Binders.Add(typeof(UserAccount), new UserAccountModelBinder ());}

改造后的Index方法如下:

public ActionResult Index(UserAccount sessionUser)
{//send emailvar email = sessionUser.Email;…………
}

上面就是全部的Model Binding解决问题的过程,希望能够帮助大家更好地理解MVC中的Model Binding。

总结

本文主要介绍了MVC中两种解决对Session,Cookie等依赖的方式,这两种方式可根据自己项目的需求具体选择使用哪种。其中Filter还有其他一些场景的使用,有兴趣的小伙伴也可以自己多多探索。

ASP.NET MVC 中解决Session,Cookie等依赖的方式相关推荐

  1. [MVC]Asp.net MVC中的Session

    [MVC]Asp.net MVC中的Session 2008年12月9日 分类: ASP.NET, ASP.NET MVC, C#, 开发笔记 最近使用ASP.NET MVC 中的Controller ...

  2. ASP.NET MVC中controller和view相互传值的方式

    ASP.NET MVC中Controller向view传值的方式: ViewBag.ViewData.TempData 单个值的传递 Json 匿名类型 ExpandoObject Cookie Vi ...

  3. ASP.NET MVC中使用Autofac实现简单依赖注入

    本文参考资料: 1.https://www.cnblogs.com/RayWang/p/11128554.html. 2.https://www.cnblogs.com/eedc/p/6127181. ...

  4. ASP.NET MVC项目 解决session失效

    Web.config配置文件 在Web.config配置文件中,通过sessionState节点上的mode属性设置 mode值共分为5种: 1.InProc: mode默认值,只是保存当前应用程序域 ...

  5. Asp.net MVC使用Model Binding解除Session, Cookie等依赖

    上篇文章"Asp.net MVC使用Filter解除Session, Cookie等依赖"介绍了如何使用Filter来解除对于Session, Cookie的依赖. 其实这个也可以 ...

  6. Asp.net MVC使用Filter解除Session, Cookie等依赖

    本文,介绍了Filter在MVC请求的生命周期中的作用和角色,以及Filter的一些常用应用场景. 同时针对MVC中的对于Session,Cookie等的依赖,如何使用Filter解依赖. 如果大家有 ...

  7. Asp.net mvc中的Ajax处理

    在Asp.net MVC中的使用Ajax, 可以使用通用的Jquery提供的ajax方法,也可以使用MVC中的AjaxHelper. 这篇文章不对具体如何使用做详细说明,只对于在使用Ajax中的一些需 ...

  8. 在 ASP.NET MVC 中使用 Chart 控件

    在 .NET 3.5 的时候,微软就提供了一个 Chart 控件,网络上有大量的关于在 VS2008 中使用这个控件的文章,在 VS2010 中,这个控件已经被集成到 ASP.NET 4.0 中,可以 ...

  9. ASP.NET Core 中简单Session登录校验

    ASP.NET Core 中简单Session登录校验:从Session的配置添加.到请求过滤.再到页面操作.推荐相关阅读:ASP.NET 会话状态概述  ASP.NET Cookie 概述  ASP ...

最新文章

  1. 外贸网站制作 网页的宽度多少为合适
  2. ubuntu下安装eclipse
  3. DELL optiplex 解决改回 AHCI蓝屏问题
  4. oracle symonym_Oracle的同义词(synonyms)
  5. 事理图谱概念辨析及其与风险标签分类结合的应用探讨
  6. MP 启动注入 SQL 原理分析
  7. 按钮button加超链接
  8. c# 调用oracle function,C#调用Oracle存储过程的方法
  9. 为什么rand()+ rand()产生负数?
  10. 如何让Zen Cart 不在头部显示分类
  11. linux ape,linux把ape+cue格式转换成flac,同时保留曲目信息转载
  12. 为了云计算的安全需要自己控制加密密钥
  13. 学习NA,Dynamips实验环境(工大瑞普)下载地址
  14. linux系统pdf目录编辑器,适用于Linux系统的七款PDF内容编辑器,附下载和安装方法...
  15. java实现心型代码
  16. [转载]ExtJS中grid按照中文拼音首字母排序、改变行背景、列背景、静态数据分页不再困难...
  17. 我以为猫咪牙齿断了一点不要紧,结果…
  18. golang 根据生日计算星座和属相
  19. HTML+CSS实现一个淡显淡隐轮播图
  20. java.lang.IllegalArgumentException: Illegal URL:

热门文章

  1. matlab speex的语音处理模块_基于MATLAB的条形码识别系统[GUI,可识别几十个图片]...
  2. linux yum 目录在哪,急问怎么知道yum从哪个地址下载的文件呢?
  3. android os跑电量咋关,android 优化耗电量
  4. java 构造器 null_java - 主结尾处的Java构造函数用户输入在构造函数中为Null - 堆栈内存溢出...
  5. 用python程序化交易名单_python程序化交易神器——tushare
  6. python数据应用场景_python应用场景
  7. 典型大数据和数据库相关活动的图标
  8. 电商促销PSD分层海报设计流程,设计师收好
  9. 适用于iPhone X屏幕|美丽线框 UI套件模板
  10. 微博html怎么编辑器,类似新浪微博的编辑器 输入@就出现可选的下拉框 是怎么实现的...