.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:身份验证过滤器,处在整个过滤器通道的最顶层.对应 ...
随机推荐
- XILINX FPGA 开发板 XC3S250E 核心板 学习板+12模块
北京太速科技有限公司为广大合作单位特设海外代购业务,主要包括各类板卡.相机.传感器.仪器仪表.专用芯片等.代购业务仅收取基本的手续费. 北京太速科技有限公司在线客服:QQ:448468544 淘宝网站 ...
- Android使用gradle依赖管理、依赖冲突终极解决方案(转)
Android使用gradle依赖管理.依赖冲突终极解决方案在Android开发中,相信遇到关于版本依赖的问题的同学有不少.虽然Android Studio一般都会自动帮我们去重,但是有时候去重失败了 ...
- 在Linux服务器上运行jar包,并且使jar包一直处于后台执行
1.我jar包在linux的目录为/a/bbb.jar 正常情况下,使用在/a目录下使用 java -jar bbb.jar 可以直接运行该jar包的项目,运行成功之后使用crtl+ ...
- Sass-加法
程序中的运算是常见的一件事情,但在 CSS 中能做运算的,到目前为止仅有 calc() 函数可行.但在 Sass 中,运算只是其基本特性之一.在 Sass 中可以做各种数学计算 (一).加法 加法运算 ...
- SpringBoot中发送邮件服务
.转载:http://www.ityouknow.com/springboot/2017/05/06/spring-boot-mail.html 简单使用 1.pom 包配置 <dependen ...
- BZOJ4269 再见xor
考前挣扎 线性基裸题 mx直接求 次大直接从低到高枚举第一个非0位 然后次大就是异或上就行了[显然贪心呐qwq 不到800b可还行 //Love and Freedom. #include<cs ...
- CentOS6.8 安装/升级Python2.7.x,并安装最新setuptools、pip、fabric程序总结
最终靠谱的可借鉴文档: 1.python官网 2.http://lovesoo.org/python-fabric-yuan-cheng-zi-dong-bu-shu-jian-jie.html 3. ...
- 【leetcode】1021. Remove Outermost Parentheses
题目如下: A valid parentheses string is either empty (""), "(" + A + ")", ...
- Delphi 安装Cnpack cnvcl后界面不断弹出 Memory Manager's list capablity overflow ,please enlarge it!
Delphi 安装Cnpack cnvcl后界面不断弹出 Memory Manager's list capablity overflow ,please enlarge it! 解决方法:删除指定 ...
- 网络协议之mDNS
DNS(Domain Name System,域名系统)因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串.通过主机名,最终得 ...