MVC过滤器中获取实体类属性值
本文地址:http://www.cnblogs.com/outtamyhead/p/3616913.html,转载请保留本地址!
最近在项目遇到了这个问题:获取Action行参中实体类的属性值,主要的逻辑是加入一个全局过滤器,从ACTION参数中截取实体类并获得它里面的内容。经过在网上以及园子里找资料,没有查到相关内容,但是也零零碎碎的获得了很多有用的信息。
过滤器主要包含四种:Authorization、Action、Result、Exception,分别对应的接口是:IAuthorizationFilter、IActionFilter、IResultFilter、IExceptionFilter,分别的解释依次是:授权过滤器接口、动作过滤器接口、结果过滤器接口、异常过滤器接口。
因为我是要在Action中获取到实体类的内容,所以我重写了OnActionExection()方法。
namespace CMPCommon
{
public class LogRecordFilterAttribute : Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
//base.OnActionExecuting(filterContext);
}
}
}
LogRecordFilterAttribute继承了Controller。如果你了解Controller就应该知道它的继承关系是怎样的。
public abstract class Controller : ControllerBase, IActionFilter, IAuthorizationFilter, IDisposable, IExceptionFilter, IResultFilter
当然,LogRecordFilterAttribute也可以单独实现IActionFilter接口。现在大体上的思路有了,但是如何获取到实体类并获取它的属性以及Value呢?通过翻阅ActionExecutingContext的定义,发现了它的一个属性:ActionParameters。这个属性的解释是:获取或设置操作-方法参数。这就意味着我可以通过这个属性得到我想要的东西。下面看这个属性的定义:
public virtual IDictionary<string, Object> ActionParameters { get; set; }
这个属性返回了一个字典,也就是键值格式。那么我就可以先通过获取它的Key,然后根据Key去取对应的Value就可以了。
int parametersCount=filterContext.ActionParameters.Count;
if ( parametersCount > )
{
var keys = filterContext.ActionParameters.Keys;
if (null != keys)
{
foreach (string key in keys)
{
var value = filterContext.ActionParameters[key];
if (null == value)
continue;
}
}
}
}
通过上面的代码,我就获取到了Action中参数的内容。但是问题又来了,如果我获得的是一个实体类,那么怎么得到它的属性值呢?通过在园子里游荡,结合自己的想法,得到了下面的代码:
if (value.GetType().IsClass && value.GetType().Name != "String")
{
object objClass = value;
PropertyInfo[] infos = objClass.GetType().GetProperties();
foreach (PropertyInfo info in infos)
{
if (info.CanRead)
{
Console.WriteLine(info.Name + "=" + info.GetValue(objClass, null));
}
} }
首先要了解的是,filterContext.ActionParameters[key]返回的是object,所以我可以通过object的GetType()方法获取到它的类型,并对该类型进行判断。当然,上方if()判断不是太全面。然后通过GetProperties()方法获取里面的属性,然后通过GetValue()方法获得属性值。
至此,我已经将Action行参中包含实体类的属性值取出来了。如果大家有比较好的方法和方式,欢迎留言讨论,如果觉得不错,请猛戳“推荐”!
MVC过滤器中获取实体类属性值的更多相关文章
- C#、Python中分别是怎么实现通过字符串获取实体类的值以及给实体类赋值
一.引入 最近遇到一个项目里面的功能,在给实体类赋值的时候,由于赋值字段是动态生成的,所以如果用常用的方法(直接实体类的名称.字段名=要赋的值),将会生成很多无用的代码,所以找到了一个通过反射的赋值与 ...
- js中获取css样式属性值
关于js中style,currentStyle和getComputedStyle几个注意的地方 (1)用js的style只能获取元素的内联样式,内部样式和外部样式使用style是获取不到的.针对css ...
- java中遍历实体类属性和类型,属性值
public static void testReflect(Object model) throws NoSuchMethodException, IllegalAccessException, I ...
- java中遍历实体类属性和类型
public static void testReflect(Object model) throws NoSuchMethodException, IllegalAccessException, I ...
- C#获取实体类属性名和值
遍历获得一个实体类的所有属性名,以及该类的所有属性的值 //先定义一个类: public class User { public string name { get; set; } public st ...
- C#利用反射获取实体类的主键名称或者获取实体类的值
//获取主键的 PropertyInfo PropertyInfo pkProp = ).FirstOrDefault(); //主键名称 var keyName=pkProp.Name; //实体类 ...
- 在spring的过滤器中注入实体类(@autowire会失效可使用这个方法)
转载:难得可贵的好文章 https://blog.csdn.net/chl191623691/article/details/78657638 首先,本文 绝对是好文!不止本文,作者的文章都是很经 ...
- 在MVC过滤器中获取触发的Controller、Action、参数 等
首先是实现接口System.Web.Mvc.IActionFilter的过滤器 获取Controller.Action.参数 方法一. string actionName = filterContex ...
- 浅拷贝工具类,快速将实体类属性值复制给VO
/** * 浅拷贝的工具类 */ public class PropertiesUtil { /** * 两个类,属性名一样的元素,复制成员. */ public static void copy(O ...
随机推荐
- paip.解决中文url路径的问题图片文件不能显示
paip.解决中文url路径的问题图片文件不能显示 #现状..中文url路径 图片文件不能显示 <img src="img/QQ截图20140401175433.jpg" w ...
- paip.配置ef_unified_filter() failed ext_filter_module mod_ext_filter.so apache 错误解决
paip.配置ef_unified_filter() failed ext_filter_module mod_ext_filter.so apache 错误解决 作者Attilax 艾龙, ...
- Maven学习总结(五)——聚合与继承
一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 <modules> <module>模块一</module> & ...
- static/final
- Python之线程池
版本一: #!/usr/bin/env python # -*- coding:utf-8 -*- import Queue import threading class ThreadPool(obj ...
- Liferay7 BPM门户开发之30: 通用帮助类Validator、ArrayUtil、StringUtil等使用
废话不多说,直接上代码. 验证类Validator 主要是空验证.数字.格式验证 调用的例子: protected void validateEmailFrom(ActionRequest actio ...
- 3D touch 静态、动态设置及进入APP的跳转方式
申明Quick Action有两种方式:静态和动态 静态是在info.plist文件中申明,动态则是在代码中注册,系统支持两者同时存在. -系统限制每个app最多显示4个快捷图标,包括静态和动态 静态 ...
- ffmpeg mp3 to m3u8
ffmpeg -i Sunshine.mp3 -c:a libmp3lame -b:a 128k -map 0:0 -f segment -segment_time 10 -segment_list ...
- iOS-OC-APP热更新,动态更新(仿QQ打开或关闭某个功能)
一.前言 iOS开发更新APP我觉得是比较坑的就是审核时间比较长,审核比较严,对于刚入行的小伙伴来说,雷区比较多:所以热更新是比较重要的: 大家也许会发现我们常用的QQ现在下来也就一百多兆,但是用了几 ...
- centos下linux运行asp网站搭建配置-mono+nginx
一.首先安装一些需要的软件包 1. 首先更新CentOS上的软件包:yum –y update. 2. 安装一些需要的库: yum -y install gcc gcc-c++ bison pkg ...