MVC過濾器中獲取實體類屬性值

本文地址:http://www.cnblogs.com/outtamyhead/p/3616913.html,轉載請保留本地址!html

最近在項目遇到了這個問題:獲取Action行參中實體類的屬性值,主要的邏輯是加入一個全局過濾器,從ACTION參數中截取實體類並得到它裏面的內容。通過在網上以及園子裏找資料,沒有查到相關內容,可是也零零碎碎的得到了不少有用的信息。ide

過濾器主要包含四種:Authorization、Action、Result、Exception,分別對應的接口是:IAuthorizationFilter、IActionFilter、IResultFilter、IExceptionFilter,分別的解釋依次是:受權過濾器接口、動做過濾器接口、結果過濾器接口、異常過濾器接口。spa

由於我是要在Action中獲取到實體類的內容,因此我重寫了OnActionExection()方法。code

namespace CMPCommon
{
    public class LogRecordFilterAttribute : Controller
    {
        protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //base.OnActionExecuting(filterContext);
        }
    }
}    

LogRecordFilterAttribute繼承了Controller。若是你瞭解Controller就應該知道它的繼承關係是怎樣的。htm

public abstract class Controller : ControllerBase, IActionFilter, IAuthorizationFilter, IDisposable, IExceptionFilter, IResultFilter

固然,LogRecordFilterAttribute也能夠單獨實現IActionFilter接口。如今大致上的思路有了,可是如何獲取到實體類並獲取它的屬性以及Value呢?經過翻閱ActionExecutingContext的定義,發現了它的一個屬性:ActionParameters。這個屬性的解釋是:獲取或設置操做-方法參數。這就意味着我能夠經過這個屬性獲得我想要的東西。下面看這個屬性的定義:blog

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()方法得到屬性值。get

至此,我已經將Action行參中包含實體類的屬性值取出來了。若是你們有比較好的方法和方式,歡迎留言討論,若是以爲不錯,請猛戳「推薦」!string

相關文章
相關標籤/搜索