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.python ide 总结最佳实践o4.
paip.python ide 总结最佳实践o4. ====2个重要的标准 1.可以自动补全 2.可以断点调试 =======选型使用报告 Komodo正好儿俄机器上有,使用累挂,自动补全还凑火.就是 ...
- cmd命令生成android签名证书
cmd命令生成android签名证书,有空在写一篇eclipse导出带签名的apk,这里面包括生成新的签名.现在还是讲讲在cmd怎么操作生成签名证书. 1.dos下进入JDK的bin目录 运行如下命令 ...
- 从零开始学Bootstrap(1)
最近需要做一个简单的Web页面. 考虑到前端经验不足,为了快速产出,同时项目只是一个工具,对项目没有什么要求,所以我选择了Bootstrap这个框架作为Web框架. 写从零开始学Bootstrap的初 ...
- 详解Bootstrap进度条组件
在网页中,进度条的效果并不少见,如:平分系统.加载状态等,进度条组件使用了css3的transition和animation属性来完成一些特效,这些特效在IE9及IE9以下版本.Firefox的老版本 ...
- Activiti保存流程图时diagrms中没有生成png解决办法
window ——> preferences——>activiti——>save——>选中create process definition image when saving ...
- 流媒体选择Nginx是福还是祸?
CDN,视频云,已经“僧多粥少” 视频直播的持续升温,无意间也让带宽生意的争夺变得异常残酷.一时间,各种云计算.CDN.视频云提供商都在视频尤其是直播上投入重兵,揭竿而起的新生起义军们也正马不停蹄的赶 ...
- Win7快捷方式图标不显示解决办法
问题:WIN7的系统,桌面.开始菜单以及任务栏的快捷方式图标显示不正常,看不到程序默认图标,快捷方式图标不显示. 解决方法:删除程序图标缓存即可. 将下面的内容复制到记事本保存为“图标缓存清理.b ...
- Mysql 如何设置字段自动获取当前时间
应用场景: 1.在数据表中,要记录每条数据是什么时候创建的,不需要应用程序去特意记录,而由数据数据库获取当前时间自动记录创建时间: 2.在数据库中,要记录每条数据是什么时候修改的,不需要应用程序去特意 ...
- (String) | String.valueOf()
Map m = new HashMap(); Integer i = 5; String s = null; m.put("val1", i); m.put("val2& ...
- 前沿技术解密——VirtualDOM
作为React的核心技术之一Virtual DOM,一直披着神秘的面纱. 实际上,Virtual DOM包含: Javascript DOM模型树(VTree),类似文档节点树(DOM) DOM模型树 ...