Nav*_*kam 8 asp.net asp.net-mvc
我需要仅从控制器操作中返回具有返回类型ActionResult的所有操作中的方法.我从以下获取控制器名称和操作名称..
string originController = filterContext.RouteData.Values["controller"].ToString();
string originAction = filterContext.RouteData.Values["action"].ToString();
Run Code Online (Sandbox Code Playgroud)
但是我怎样才能过滤只有返回类型ActionResult的方法?
小智 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();
Run Code Online (Sandbox Code Playgroud)
试试这个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'
Run Code Online (Sandbox Code Playgroud)
更新:
由于您正在使用该OnResultExecuted方法,请尝试以下方法:
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'
}
Run Code Online (Sandbox Code Playgroud)
更新:
根据您的评论,如果有多个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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9510 次 |
| 最近记录: |