.NET MVC过滤器ActionFilterAttribute验证权限以及Model
项目使用.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相关推荐
- MVC 过滤器使用 ActionFilterAttribute
在asp.net mvc 中 webapi 和 mvc 处理消息是两个不同的管道,Asp.net mvc 和 webapi 为我们提供的 ActionFilterAttribute 拦截器,通过 重写 ...
- ASP.NET MVC以ModelValidator为核心的Model验证体系: ModelValidator
旨在为目标Action方法的执行绑定输入参数的Model绑定过程伴随着对Model的验证.借助相应的验证特性,我们可以直接以声明的方式在Model类型上定义验证规则,这些规则将会作为Model元数据的 ...
- ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则
对于Model验证,理想的设计应该是场景驱动的,而不是Model(类型)驱动的,也就是对于同一个Model对象,在不同的使用场景中可能具有不同的验证规则.举个简单的例子,对于一个表示应聘者的数据对象来 ...
- ASP.NET MVC过滤器(一)
MVC过滤器是加在 Controller 或 Action 上的一种 Attribute,通过过滤器,MVC 网站在处理用户请求时,可以处理一些附加的操作,如:用户权限验证.系统日志.异常处理.缓存等 ...
- MVC之ActionFilterAttribute自定义属性
ActionFilterAttribute里有OnActionExecuting方法,跟Controller一样, 同是抽象实现了IActionFilter接口. // 登录认证特性 public c ...
- ASP.NET MVC 过滤器(三)
ASP.NET MVC 过滤器(三) 前言 本篇解说行为过滤器的运行过程,过滤器实现.使用方式有AOP的意思.能够通过学习了解过滤器在框架中的运行过程从而获得一些AOP方面的知识(在顺序运行的过程中, ...
- 使用MiniProfiler跟踪MVC + EF + Bootstrap 2 权限管理系统的性能消耗
安装MiniProfiler 在MVC + EF + Bootstrap 2 权限管理系统入门级(附源码)文章中下载了它的源码,调试模式下打开一个页面都要再2.5秒以上,所以使用MiniProfile ...
- [转]Asp.Net大型项目实践(11)-基于MVC Action粒度的权限管理【续】【源码在这里】(在线demo,全部源码)...
本文转自:http://www.cnblogs.com/legendxian/archive/2010/01/25/1655551.html 接上篇Asp.Net大型项目实践(10)-基于MVC Ac ...
- 跟我一起学.NetCore之MVC过滤器,这篇看完走路可以仰着头走
前言 MVC过滤器在之前Asp.Net的时候就已经广泛使用啦,不管是面试还是工作,总有一个考点或是需求涉及到,可以毫不疑问的说,这个技术点是非常重要的: 在之前参与的面试中,得知很多小伙伴只知道有一两 ...
最新文章
- 小程序创业:新金矿、野望与焦虑
- Oracle osw监控工具的使用示例
- JAVA_OA(五):SpringMVC接受传入页面的参数值
- 【译】Economics of Fees and Gas
- 【案例分享】crontab执行脚本异常问题
- 【MFC系列-第21天】GDI算法实战——过渡色
- java私塾 java篇_Java私塾跟我学系列——JAVA篇 五、
- session保存密码_年薪百万之路--第六十四天 Cookie操作与session操作
- 2.SQL里的聚合函数
- 数据结构:邻接表法存储有向图
- 28款数据恢复软件分类介绍
- 房屋租赁合同法律规定是怎样的
- 未来大数据还有就业机会吗?
- 社群运营,做好群活跃的6个要点
- 开源自助建站系统源码完整源码+搭建教程 傻瓜式一键建站系统源码
- 天河超级计算机观后感,“天河一号”超级计算机读后感
- 红米K50电竞版上手体验
- 大数加法(ascll转换),利息计算(数组,sizeof与循环运用)
- 医生学计算机:强大的shar, ubuntu 的强大压缩工具,超出想像
- 如何在 Qt Creater 中添加资源文件
热门文章
- reset.css 重置样式表
- 服务器上的文件总提示只读,如何解决域内成员打开文件老是以只读方式打开
- MYSQL中limit以及oder by混用产生的一些错误
- python安装打不开 显示丢失python38.dll_python38.dll
- 如何进入同一家庭组的计算机,win7系统利用家庭组把多台电脑共享起来的步骤...
- sql server存储过程简单使用
- openssl-RSA签名和验签
- 剑指Offer——变态跳台阶(厉害的癞蛤蟆)
- Windows NT File System Internals----Chapter 5 The NT Virtual Memory Manage
- 有状态和无状态(@stateless/@stateful)