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 > 0)
   {
     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行参中包含实体类的属性值取出来了。如果大家有比较好的方法和方式,欢迎留言讨论,如果觉得不错,请猛戳“推荐”!

 

posted @ 2014-03-21 23:01  禁止吸烟  阅读(6691)  评论(2编辑  收藏  举报