2013-07-25 13 views
7

コントローラのアクションから戻り値の型ActionResultを持つすべてのアクションからメソッドのみをフィルタリングする必要があります。 私は..OnResultExecutedのActionResultのfilterContext ASP.NET MVCのメソッド

string originController = filterContext.RouteData.Values["controller"].ToString(); 
string originAction = filterContext.RouteData.Values["action"].ToString(); 

をコントローラ名と、次のアクション名を取得していますが、どのように私は、戻り値の型のActionResultを持っている唯一の方法をフィルタリングすることができますか?

+0

あなたにそのメソッドシグネチャの戻り値の型として 'ActionResult'を定義する' actions'だけを必要としていることを意味していますか?または( 'ViewResult'のような)具体的なActionResultsを定義する' actions'も必要ですか? – haim770

+0

いいえ。私はActionResultとして定義されたアクションだけを必要とします。それらをfilterContextから取得できますか? –

答えて

9

は、コントローラにアクセスするためのこの種のコードを試してみてくださいアクションだけでなく、

string originController = filterContext.RouteData.Values["controller"].ToString(); 
    string originAction = filterContext.RouteData.Values["action"].ToString(); 
    string originArea = String.Empty; 
    if (filterContext.RouteData.DataTokens.ContainsKey("area")) 
     originArea = filterContext.RouteData.DataTokens["area"].ToString(); 
5

あなたAction Filterでこれを試してみてください:

var controllerActionDescriptor = filterContext.ActionDescriptor as System.Web.Mvc.ReflectedActionDescriptor; 

if (controllerActionDescriptor == null || 
    controllerActionDescriptor.MethodInfo.ReturnType != typeof(ActionResult)) 
     { 
     return; 
     } 

// if we got here then Action's return type is 'ActionResult' 

更新:

public override void OnResultExecuted(ResultExecutedContext filterContext) 
{ 
    string originController = filterContext.RouteData.Values["controller"].ToString(); 
    string originAction = filterContext.RouteData.Values["action"].ToString(); 

    var actionType = filterContext.Controller.GetType().GetMethod(originAction).ReturnType; 

    if (actionType != typeof(ActionResult)) 
     return; 

    // if we got here then Action's return type is 'ActionResult' 
} 

更新:

あなたがOnResultExecutedメソッドを使用しているので、これを試してみてくださいあなたのコメントを1として

は、場合がある(過負荷状態に)同じ名前を持つ複数のAction

public override void OnResultExecuted(ResultExecutedContext filterContext) 
{ 
    var actionName = filterContext.RouteData.Values["action"].ToString(); 

    var ctlr = filterContext.Controller as Controller; 
    if (ctlr == null) return; 
    var invoker = ctlr.ActionInvoker as ControllerActionInvoker; 
    if (invoker == null) return; 

    var invokerType = invoker.GetType(); 
    var getCtlrDescMethod = invokerType.GetMethod("GetControllerDescriptor", BindingFlags.NonPublic | BindingFlags.Instance); 
    var ctlrDesc = getCtlrDescMethod.Invoke(invoker, new object[] {ctlr.ControllerContext}) as ControllerDescriptor; 

    var findActionMethod = invokerType.GetMethod("FindAction", BindingFlags.NonPublic | BindingFlags.Instance); 
    var actionDesc = findActionMethod.Invoke(invoker, new object[] { ctlr.ControllerContext, ctlrDesc, actionName }) as ReflectedActionDescriptor; 
    if (actionDesc == null) return; 

    if (actionDesc.MethodInfo.ReturnType == typeof (ActionResult)) 
    { 
     // you're in 
    } 
} 
+0

ここでfilterContextはResultExecutedContextです。私はそれをOnResultExecuted(ResultExecutedContext filterContext){}メソッドで使用しました。だから私はfilterContext.ActionDescriptorを取得することができません。 –

+0

私はそれに応じて私の答えを改訂しました – haim770

+0

私はOnResultExecutedメソッドを使用しています。 2番目のものは正常に動作しています..非常に多くの@haimありがとうございます。 –

関連する問題