.net core mvc model填充过滤器
在程序开发中,我们可能经常遇到所有的数据库表有相同的属性和行为,比如需要记录数据的创建人员,创建时间,修改时间和修改人。如果在每个action中都加上这些信息,代码看着比较冗余,看着不那么优雅,于是考虑添加一个过滤器,在请求进入aciton之前对模型进行填充。这样我们就不必要在每个action中进行创建时间或者登录人员的信息进行复制一类的操作,使编程过程更加专注于业务。同时,我们也可以在这里进行一些关键词的过滤或者英文单引号过滤。
在这里我选择使用的是ActionFilterAttribute,通过重写OnActionExecuting方法填充model。具体实现代码如下:
public class ModelFillFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
base.OnActionExecuting(context); var parameters = context.ActionArguments; parameters.ForEach(parameter =>
{
var model = parameter.Value;
if (model == null) return;
var list = new ArrayList(); if (typeof(ICollection).IsAssignableFrom(model.GetType()))
{
list.AddRange(model as ICollection);
}
else
{
list.Add(model);
} list.ToArray().ForEach(item =>
{
var propertys = item.GetType().GetProperties();
propertys.ForEach(p =>
{
// 替换' 解决sql注入问题
if (p.PropertyType.Name.ToLower().Contains("string") && p.GetValue(item) != null && p.GetSetMethod() != null)
{
p.SetValue(item, p.GetValue(item).ToString().Replace("'", "''"));
}
});
});
}); var tokenObj = context.HttpContext.Request.Form["token"]; if (!string.IsNullOrEmpty(tokenObj))
{
var token = tokenObj.ToString();
var userInfoService = Ioc.GetService<IUserInfoService>();
var user = userInfoService.Get<UserInfoModel>(string.Format(" LoginToken='{0}'", token)); if (user != null)
{
parameters.ForEach(parameter =>
{
var model = parameter.Value;
if (model == null) return; var list = new ArrayList(); if (typeof(ICollection).IsAssignableFrom(model.GetType()))
{
list.AddRange(model as ICollection);
}
else
{
list.Add(model);
} list.ToArray().ForEach(item =>
{
var propertys = item.GetType().GetProperties();
//模型处于创建状态
bool isCreate = propertys.Any(p => p.Name.ToLower() == "id" &&
(p.GetValue(item) == null ||
string.IsNullOrEmpty(p.GetValue(item).ToString()) ||
p.GetValue(item).ToString() == ""));
if (isCreate)
{
propertys.ForEach(p =>
{
//字段填充
if (p.Name.ToLower() == "createdby" && p.GetSetMethod() != null && user != null)
p.SetValue(item, Convert.ToInt32(user.Id));
else if (p.Name.ToLower() == "createdat" && p.GetSetMethod() != null)
p.SetValue(item, DateTime.Now);
});
} //模型处于编辑状态
bool isUpdate = propertys.Any(p => p.Name.ToLower() == "id" &&
(p.GetValue(item) != null &&
!string.IsNullOrEmpty(p.GetValue(item).ToString()) &&
p.GetValue(item).ToString() != ""));
if (isUpdate)
{
propertys.ForEach(p =>
{
//字段填充
if (p.Name.ToLower() == "updatedby" && p.GetSetMethod() != null && user != null)
p.SetValue(item, Convert.ToInt32(user.Id));
else if (p.Name.ToLower() == "updatedat" && p.GetSetMethod() != null)
p.SetValue(item, DateTime.Now);
});
} //既不是创建也不是编辑状态
if (!isCreate && !isUpdate)
{
propertys.ForEach(p =>
{ });
}
});
});
}
}
} /// <summary>
/// 清楚敏感词汇
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
private bool IsContainKey(string key)
{
return false;
}
}
在代码实现过程中,这里是通过判断id是否有值用来判断这次请求是添加还是修改操作,以便进行不同的赋值。都可以根据自身情况进行不同的判断。
.net core mvc model填充过滤器的更多相关文章
- .net core MVC 通过 Filters 过滤器拦截请求及响应内容
前提: 需要nuget Microsoft.Extensions.Logging.Log4Net.AspNetCore 2.2.6: Swashbuckle.AspNetCore 我暂时用的是 ...
- .net core MVC Filters 过滤器介绍
一.过滤器的优级依次介绍如下(逐次递减): Authorization Filter -> Resource Filter -> Acton Filter -> Exception ...
- ASP.NET Core MVC 过滤器介绍
过滤器的作用是在 Action 方法执行前或执行后做一些加工处理.使用过滤器可以避免Action方法的重复代码,例如,您可以使用异常过滤器合并异常处理的代码. 过滤器如何工作? 过滤器在 MVC Ac ...
- asp.net core MVC 过滤器之ActionFilter过滤器(二)
本系类将会讲解asp.net core MVC中的内置全局过滤器的使用,将分为以下章节 asp.net core MVC 过滤器之ExceptionFilter过滤器(一) asp.net core ...
- .Net Core MVC 过滤器(一)
1.过滤器 过滤器运行在MVC Action Invocation Pipeline(MVC Action 请求管道),我们称它为Filter Pipleline(过滤器管道),Filter Pi ...
- 008.Adding a model to an ASP.NET Core MVC app --【在 asp.net core mvc 中添加一个model (模型)】
Adding a model to an ASP.NET Core MVC app在 asp.net core mvc 中添加一个model (模型)2017-3-30 8 分钟阅读时长 本文内容1. ...
- asp.net core MVC 全局过滤器之ExceptionFilter异常过滤器(一)
本系类将会讲解asp.net core MVC中的内置全局过滤器的使用,将分为以下章节 asp.net core MVC 过滤器之ExceptionFilter异常过滤器(一) asp.net cor ...
- 解说asp.net core MVC 过滤器的执行顺序
asp.net core MVC 过滤器会在请求管道的各个阶段触发.同一阶段又可以注册多个范围的过滤器,例如Global范围,controller范围等.以ActionFilter为例,我们来看看过滤 ...
- Asp.Net Core MVC框架内置过滤器
第一部分.MVC框架内置过滤器 下图展示了Asp.Net Core MVC框架默认实现的过滤器的执行顺序: Authorization Filters:身份验证过滤器,处在整个过滤器通道的最顶层.对应 ...
随机推荐
- regex - POSIX 1003.2 正则表达式
DESCRIPTION 正则表达式 (``RE''s), 在 POSIX 1003.2 中定义,包含两种类型:新式 REs (基本上指的是 egrep 使用的那些,1003.2 称其为 ``exten ...
- Linux 脚本运维总结之Shell script
1. 本地变量和环境变量 变量类型 定义形式 声明位置 显示命令 作用域 本地变量 VARNAME=value 命令行或shell脚本 set (显示所有变量) 本用户,本进程 环境变量 export ...
- sed使用---转义字符
https://blog.csdn.net/wangcg123/article/details/50667883 单引号里面,s表示替换,三根斜线中间是替换的样式,特殊字符需要使用反斜线”\”进行转义 ...
- 抽象类(abstract)与接口(interface)的区别
如果一个类中包含抽象方法,那么这个类就是抽象类.abstract只能用来修饰类或者方法,不能用来修饰属性. 接口是指一个方法的集合,接口中的所有方法都没有方法体.接口通过关键字interface实现. ...
- Codeforces Round #554 (Div. 2) C.Neko does Maths (gcd的运用)
题目链接:https://codeforces.com/contest/1152/problem/C 题目大意:给定两个正整数a,b,其中(1<=a,b<=1e9),求一个正整数k(0&l ...
- Sass函数--列表函数append
append() 函数是用来将某个值插入到列表中,并且处于最末位. >> append(10px 20px ,30px) (10px 20px 30px) >> append( ...
- linux中设置虚拟域名
一.打开tomcat安装目录下conf/server.xml这个文件在server.xml文档中找到 </Engine></Service> 接着添加上面添加以下内容(暂时先说 ...
- 【学习笔记】虚树复习记(BZOJ2286 SDOI2011 消耗战)
想写战略游戏却想不起来虚树T^T 所以就有了这篇复习记QwQ ——简介!—— 我们在处理树上问题的时候,dfs是一个常用手段,但是我们发现,如果一棵树上只有一部分关键点,每次dfs需要访问好多不是关键 ...
- JavaSE---多线程---扩展
1.线程的类型 1.1 用户线程 1.2 内核线程 2.java线程 java线程的创建依赖于系统内核,通过JVM调用系统库创建内核线程: 内核线程与java-Thread是1:1的映射关系: 3.线 ...
- git基础常用命令
常用命令 git init //初始化本地git环境 git clone XXX//克隆一份代码到本地仓库 git pull //把远程库的代码更新到工作台 git pull --rebase ori ...