.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:身份验证过滤器,处在整个过滤器通道的最顶层.对应 ...
随机推荐
- Git --06 Git-gui安装
目录 1.Git-gui安装 1.Git-gui安装
- c语言开发浏览器插件
c语言开发浏览器插件 senk????sec???
- Center os vi
vi /etc/virc set nu 设置所有文件显示行号 :1,$s/after/befer/g 全局替换 :%s/after/befer/g 全局替换 yy 复制一行 p 粘贴 yw 复制一个 ...
- Kafka初识
1.概述 1.1.Apache Kafka是一个 分布式 流处理 平台: 2.Kafka适应于什么场景? 2.1.构造 实时 流数据管道,在 系统 或 应用之间 可靠地获取数据(相当 ...
- NET Core+win10+Jenkins+Gogs+open ssh持续集成
背景 阿里云测试环境一台,带宽1M跟不上,Jenkins安装一个插件耗时很长,于是想在本地搭建Jenkins服务,将生成的安装文件同步到目标服务器上. 技术点有: win10:本地环境是win10,测 ...
- Yii2.0基础框架
前言:最近在用php写一个项目的接口,所以需要学习一下Yii的框架,也在这里记录一下. 整体结构 ssets文件夹:assets的作用是方便模块化,插件化的,一般来说出于安全原因不允许通过url访问p ...
- vue-葵花宝典
router-view 中包含 router-view 这种情况就可以 使用嵌套路由了 变化的视图中包含变化的视图 代码层面 router-view 中 包含router-view 路由childre ...
- 关于iphone设置显示模式为标准模式和放大模式时的区别
参考来自:https://www.jianshu.com/p/5f61d914114b CGFloat scale = [[UIScreen mainScreen] scale]; CGFloat n ...
- 【HDOJ6579】Operation(线性基)
题意:给定一个数列a,给定两种操作: 1.询问[l,r]区间内最大的xor和 2.n++,a[n]赋值为x 要求强制在线 n,m<=5e5,a[i]<2^30 思路:同CF1100F 固定 ...
- http 请求包含哪几个部分(请求行、请求头、请求体)
http协议报文 1.请求报文(请求行/请求头/请求数据/空行) 请求行 求方法字段.URL字段和HTTP协议版本 例如:GET ...