2013-07-25 18 views
7

Yalnızca denetleyici eylemlerinden dönüş türü ActionResult olan tüm eylemlerden yöntemleri filtrelemem gerekiyor. Ben ..filterCultext for ActionResult OnResultExcuted yöntemi ASP.NET MVC için

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

kontrolör adını ve aşağıdakiler arasından eylem adını alıyorum ama nasıl ben döndürme türü ActionResult tek yöntemi filtre?

+0

You "ActionResult" ifadesini yalnızca yöntem imzasında dönüş türü olarak tanımlayan "eylemleri" istediğiniz anlamına gelir. ya da somut ActionResults ('ViewResult' gibi) tanımlayan 'eylemleri' mi istiyorsunuz? – haim770

+0

no .. Sadece ActionResult olarak tanımlanan eylemleri istiyorum .. Bunu filterContext'ten alabilir miyim? –

cevap

9

, Kontrolörleri erişim için kod bu tür deneyin Eylemler yanı sıra

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

sizin Action Filter bu deneyin:

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' 

Güncelleme:

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' 
} 

Güncelleme:

Eğer OnResultExecuted yöntemini kullandığınızdan, bu deneyinYorumunuza gereğince

, olayı mevcuttur (aşırı yükleme) aynı ada sahip birden fazla 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

Burada filterContext, ResultExecutedContext şeklindedir. OnResultExecuted (ResultExecutedContext filterContext) {} yönteminde kullandım. Bu yüzden filterContext.ActionDescriptor elde edemiyorum. –

+0

Yanıtımı, – haim770

+0

OnResultExecuted yöntemini kullanırken uygun şekilde değiştirdim. İkincisi iyi çalışıyor .. Teşekkür ederim Çok Çok @haim. –