本文地址: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过滤器中获取实体类属性值的更多相关文章

  1. C#、Python中分别是怎么实现通过字符串获取实体类的值以及给实体类赋值

    一.引入 最近遇到一个项目里面的功能,在给实体类赋值的时候,由于赋值字段是动态生成的,所以如果用常用的方法(直接实体类的名称.字段名=要赋的值),将会生成很多无用的代码,所以找到了一个通过反射的赋值与 ...

  2. js中获取css样式属性值

    关于js中style,currentStyle和getComputedStyle几个注意的地方 (1)用js的style只能获取元素的内联样式,内部样式和外部样式使用style是获取不到的.针对css ...

  3. java中遍历实体类属性和类型,属性值

    public static void testReflect(Object model) throws NoSuchMethodException, IllegalAccessException, I ...

  4. java中遍历实体类属性和类型

    public static void testReflect(Object model) throws NoSuchMethodException, IllegalAccessException, I ...

  5. C#获取实体类属性名和值

    遍历获得一个实体类的所有属性名,以及该类的所有属性的值 //先定义一个类: public class User { public string name { get; set; } public st ...

  6. C#利用反射获取实体类的主键名称或者获取实体类的值

    //获取主键的 PropertyInfo PropertyInfo pkProp = ).FirstOrDefault(); //主键名称 var keyName=pkProp.Name; //实体类 ...

  7. 在spring的过滤器中注入实体类(@autowire会失效可使用这个方法)

    转载:难得可贵的好文章 https://blog.csdn.net/chl191623691/article/details/78657638 首先,本文   绝对是好文!不止本文,作者的文章都是很经 ...

  8. 在MVC过滤器中获取触发的Controller、Action、参数 等

    首先是实现接口System.Web.Mvc.IActionFilter的过滤器 获取Controller.Action.参数 方法一. string actionName = filterContex ...

  9. 浅拷贝工具类,快速将实体类属性值复制给VO

    /** * 浅拷贝的工具类 */ public class PropertiesUtil { /** * 两个类,属性名一样的元素,复制成员. */ public static void copy(O ...

随机推荐

  1. TF Boys (TensorFlow Boys ) 养成记(四)

    前面基本上把 TensorFlow 的在图像处理上的基础知识介绍完了,下面我们就用 TensorFlow 来搭建一个分类 cifar10 的神经网络. 首先准备数据: cifar10 的数据集共有 6 ...

  2. css3过渡transition

    过渡:transition transition:transition-property/duration/timing-function/delay的缩写. transition : <'tr ...

  3. JavaWeb学习总结(十七)——JSP中的九个内置对象

    一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...

  4. JQ中mouseover和mouseenter的区别

    我最近也在学习JQuery,所以最近对JQ中的一些小问题进行总结,方便学习. 在对于刚开始学习JQ的初学者来说,mouseover事件和mouseenter事件总是傻傻分不清楚,毕竟刚开始学习的时候, ...

  5. Linux Buffers和Cached的区别(转)

    在linux下使用free命令查看内存使用情况,有buffers和cached两项,以下是它们的区别: buffers是为块设备设计的缓冲.比如磁盘读写,把分散的写操作集中进行,减少磁盘I/O,从而提 ...

  6. JS中的各种检测

    //null 只在肯定返回null值时才使用null比较 var element = document.getElementById("my-div"); if (element ...

  7. java文件同步性能测试

    2003同步速度

  8. GTD时间管理(3)---时间特区图

    最近在网上看到一副时间特区图,想象非常深,特点想分享给大家. 从上图可以看出 说明一个人全天的状况 说明: 全天时段 状态 7:30-8:00 是处于起床,穿衣,刷牙,吃早餐 8:00-9:00 是处 ...

  9. android通话时第二通电话呼叫等待提示音音量大小

    callnotifier.java  public void run() { ......             switch (mToneId) {                 case TO ...

  10. 怎样用UltraISO制作U盘系统安装盘

    http://jingyan.baidu.com/article/d169e186800f02436711d87b.html 如今用u盘装系统成为主流,如何不被社会淘汰.跟我往下边看吧~~ 工具/原料 ...