.net core mvc model填充过滤器
Posted heshuaiblog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.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() == "0")); 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() != "0")); 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填充过滤器的主要内容,如果未能解决你的问题,请参考以下文章
通过 ASP.NET Core 3.1/5.0 MVC 中的脚本使用选定的 ''value='' 填充数据库
用数据 ASP.NET CORE MVC Jquery 填充弹出模式
如何从 HttpContext 获取 ASP.NET Core MVC 过滤器
在 ASP.NET Core MVC Razor 视图中,与 @model IEnumerable<Namespace.Model> Vs @model<Namespace.Mode