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

  • 相关阅读:
    近来感受
    GIT相关命令
    CMMI评审总结
    Windows下Git Bash的设置
    PHP学习三--常用运算符和结构语句
    PHP学习二--常量
    MYSQL基础十一--存储引擎
    MYSQL基础十--存储过程
    MYSQL基础九--自定义函数
    MYSQL基础八--子查询和连接
  • 原文地址:https://www.cnblogs.com/outtamyhead/p/3616913.html
Copyright © 2020-2023  润新知