zoukankan      html  css  js  c++  java
  • 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()方法获得属性值。

  • 相关阅读:
    UVA.10325 The Lottery (组合数学 容斥原理 二进制枚举)
    UVA.11806 Cheerleaders (组合数学 容斥原理 二进制枚举)
    容斥原理、鸽巢原理快速入门
    HDU.1847 Good Luck in CET-4 Everybody! ( 博弈论 SG分析)
    HDU.1850 being a good boy in spring festival (博弈论 尼姆博弈)
    POJ.1067 取石子游戏 (博弈论 威佐夫博弈)
    HDU.2516 取石子游戏 (博弈论 斐波那契博弈)
    HDU.2147 kiki's game (博弈论 PN分析)
    Front Page
    2018-2019 9th BSUIR Open Programming Championship. Semifinal
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3619921.html
Copyright © 2011-2022 走看看