项目使用.NET MVC开发,在开发过程中网站权限以及页面ViewModel的验证是比较常见的,本文主要记录在维护以前.NET MVC项目时将权限和Model的验证通过过滤器ActionFilterAttribute的方式来进行优化,达到简化程序代码提高效率。

最近接到维护性项目的反馈说网站有冗余的数据,通过查看和分析代码发现项目以前在创建数据的时候为添加Model验证以及权限验证,通过页面加上验证可以快速的修复该问题。但是通过熟悉项目,发现项目很多地方都有这个问题,于是准备使用ActionFilterAttribute过滤器的方式来修复该问题,已达到代码侵入以及修改尽量最少,来提高效率。

这是以前的旧代码片段:

        [HttpPost]public ActionResult Create(CreateModel model){_userService.Add(model);return Json(DialogFactory.Create(DialogType.Success, string.Empty, "提交成功!"));}

开发用户权限以及模型验证的过滤器,权限仅仅简单的验证是否登录,模型验证通过ModelState完成,代码如下:

    /// <summary>/// 名    称:模型验证/// 描    述:验证模型Model/// 备    注:返回JSON对象/// </summary>public class ModelValidateAttribute : ActionFilterAttribute{/// <summary>/// 是否要求登录验证/// </summary>private bool _loginRequired = false;/// <summary>/// 无参构造方法/// </summary>public ModelValidateAttribute(): this(false) {}/// <summary>/// 参数构造方法/// </summary>/// <param name="login"></param>public ModelValidateAttribute(bool login){this._loginRequired = login;}/// <summary>/// 请求前验证模型/// </summary>/// <param name="filterContext">上下文</param>public override void OnActionExecuting(ActionExecutingContext filterContext){base.OnActionExecuting(filterContext);if (_loginRequired){var loginUser = ApplicationSignInManager.GetLoginUser();//当前登录用户if (loginUser == null){if (filterContext.HttpContext.Request.IsAjaxRequest()){filterContext.Result = new JsonResult(){Data = DialogFactory.Create(DialogType.Error, "登陆过期,请重新登陆"),JsonRequestBehavior = JsonRequestBehavior.AllowGet};return;}else{var returnUrl = filterContext.HttpContext.Request.RawUrl;filterContext.Result = new RedirectToRouteResult("EKP.Front", new RouteValueDictionary() {{ "controller", "User" },{ "action", "Login" },{ "returnUrl", returnUrl},}, true);return;}}}var modelState = filterContext.Controller.ViewData.ModelState;if (!modelState.IsValid){//将验证信息返回var errors = new Dictionary<string, string>();var messages = modelState.Values.SelectMany(item => item.Errors).Select(item => item.ErrorMessage).ToList();foreach (KeyValuePair<string, ModelState> keyValue in modelState){errors[keyValue.Key] = string.Join(";", keyValue.Value.Errors.Select(e => e.ErrorMessage));}filterContext.Result = new JsonResult(){Data = DialogFactory.Create(DialogType.Error, string.Join("<br/>", errors.Values))};return;}}}

程序中用到了DialogFactory工厂的Create方法,主要创建不同类型的Json对象。过滤器开发好之后,直接在需要验证的Action上面增加[ModelValidate(true)]属性即可,true表示需要登录验证,如果不需要验证登录不带true参数即可,示例:

        [HttpPost][ModelValidate(true)]public ActionResult Create(CreateModel model){_userService.Add(model);return Json(DialogFactory.Create(DialogType.Success, string.Empty, "提交成功!"));}

NET MVC中用户登录权限和Model模型验证的过滤器的简单开发就完成了,过滤器的使用场景还是比较多的,希望本文可以帮助到其他网友,如果有地方描述不准确或者错误,欢迎网友的反馈和建议!

.NET MVC过滤器ActionFilterAttribute验证权限以及Model相关推荐

  1. MVC 过滤器使用 ActionFilterAttribute

    在asp.net mvc 中 webapi 和 mvc 处理消息是两个不同的管道,Asp.net mvc 和 webapi 为我们提供的 ActionFilterAttribute 拦截器,通过 重写 ...

  2. ASP.NET MVC以ModelValidator为核心的Model验证体系: ModelValidator

    旨在为目标Action方法的执行绑定输入参数的Model绑定过程伴随着对Model的验证.借助相应的验证特性,我们可以直接以声明的方式在Model类型上定义验证规则,这些规则将会作为Model元数据的 ...

  3. ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则

    对于Model验证,理想的设计应该是场景驱动的,而不是Model(类型)驱动的,也就是对于同一个Model对象,在不同的使用场景中可能具有不同的验证规则.举个简单的例子,对于一个表示应聘者的数据对象来 ...

  4. ASP.NET MVC过滤器(一)

    MVC过滤器是加在 Controller 或 Action 上的一种 Attribute,通过过滤器,MVC 网站在处理用户请求时,可以处理一些附加的操作,如:用户权限验证.系统日志.异常处理.缓存等 ...

  5. MVC之ActionFilterAttribute自定义属性

    ActionFilterAttribute里有OnActionExecuting方法,跟Controller一样, 同是抽象实现了IActionFilter接口. // 登录认证特性 public c ...

  6. ASP.NET MVC 过滤器(三)

    ASP.NET MVC 过滤器(三) 前言 本篇解说行为过滤器的运行过程,过滤器实现.使用方式有AOP的意思.能够通过学习了解过滤器在框架中的运行过程从而获得一些AOP方面的知识(在顺序运行的过程中, ...

  7. 使用MiniProfiler跟踪MVC + EF + Bootstrap 2 权限管理系统的性能消耗

    安装MiniProfiler 在MVC + EF + Bootstrap 2 权限管理系统入门级(附源码)文章中下载了它的源码,调试模式下打开一个页面都要再2.5秒以上,所以使用MiniProfile ...

  8. [转]Asp.Net大型项目实践(11)-基于MVC Action粒度的权限管理【续】【源码在这里】(在线demo,全部源码)...

    本文转自:http://www.cnblogs.com/legendxian/archive/2010/01/25/1655551.html 接上篇Asp.Net大型项目实践(10)-基于MVC Ac ...

  9. 跟我一起学.NetCore之MVC过滤器,这篇看完走路可以仰着头走

    前言 MVC过滤器在之前Asp.Net的时候就已经广泛使用啦,不管是面试还是工作,总有一个考点或是需求涉及到,可以毫不疑问的说,这个技术点是非常重要的: 在之前参与的面试中,得知很多小伙伴只知道有一两 ...

最新文章

  1. 小程序创业:新金矿、野望与焦虑
  2. Oracle osw监控工具的使用示例
  3. JAVA_OA(五):SpringMVC接受传入页面的参数值
  4. 【译】Economics of Fees and Gas
  5. 【案例分享】crontab执行脚本异常问题
  6. 【MFC系列-第21天】GDI算法实战——过渡色
  7. java私塾 java篇_Java私塾跟我学系列——JAVA篇 五、
  8. session保存密码_年薪百万之路--第六十四天 Cookie操作与session操作
  9. 2.SQL里的聚合函数
  10. 数据结构:邻接表法存储有向图
  11. 28款数据恢复软件分类介绍
  12. 房屋租赁合同法律规定是怎样的
  13. 未来大数据还有就业机会吗?
  14. 社群运营,做好群活跃的6个要点
  15. 开源自助建站系统源码完整源码+搭建教程 傻瓜式一键建站系统源码
  16. 天河超级计算机观后感,“天河一号”超级计算机读后感
  17. 红米K50电竞版上手体验
  18. 大数加法(ascll转换),利息计算(数组,sizeof与循环运用)
  19. 医生学计算机:强大的shar, ubuntu 的强大压缩工具,超出想像
  20. 如何在 Qt Creater 中添加资源文件

热门文章

  1. reset.css 重置样式表
  2. 服务器上的文件总提示只读,如何解决域内成员打开文件老是以只读方式打开
  3. MYSQL中limit以及oder by混用产生的一些错误
  4. python安装打不开 显示丢失python38.dll_python38.dll
  5. 如何进入同一家庭组的计算机,win7系统利用家庭组把多台电脑共享起来的步骤...
  6. sql server存储过程简单使用
  7. openssl-RSA签名和验签
  8. 剑指Offer——变态跳台阶(厉害的癞蛤蟆)
  9. Windows NT File System Internals----Chapter 5 The NT Virtual Memory Manage
  10. 有状态和无状态(@stateless/@stateful)