Asp.net mvc 如何在OnActionExecuting中获取参数?

Asp.net mvc 如何在OnActionExecuting中获取参数?,asp.net-mvc,Asp.net Mvc,我稍微修改了一下默认路由规则,如下所示: routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id= (string)

我稍微修改了一下默认路由规则,如下所示:

routes.MapRoute(
  "Default",                                              // Route name
  "{controller}/{action}/{id}",                           // URL with parameters
  new { controller = "Home", action = "Index", id= (string)null }  // Parameter defaults
);
然后我可以将url设置为:

/Controller/Action/myParam
/Home/Index/MyParam
默认操作索引为:

public ActionResult Index(string id)
{
  //....
}

我可以让param开始行动。但我想把这个参数弄进去。我该如何操作?

您应该可以通过以下方式访问它:

public override void OnActionExecuting(ActionExecutingContext filterContext) {
    string id = filterContext.RouteData.Values["id"];
    //...
}

从你的filterContext中,你应该能够得到你需要的任何东西


public class MyAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
       //Do your stuff here
    }
}

[MyAttribute]
public ActionResult Index(string id)
{
  //....
}

如果要获取控制器、操作和所有参数,可以执行此操作

    var valuesStr = new StringBuilder();
    if (ctx.RouteData != null && ctx.RouteData.Values != null)
        foreach (var v in ctx.RouteData.Values)
            valuesStr.AppendFormat("/{0}", v.Value);
    _logger.Info("executing {0}", valuesStr.ToString());
    which results in the whole path 
结果如下:

"/Get/Customer/215840"

它也应该适用于多个参数

我使用以下代码检索并比较传递给操作(.net core 3.1)的参数

有关OnActionExecuting和自定义属性初始化ActionAttribute的更多详细信息

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        ControllerActionDescriptor controlActionDescriptor = (ControllerActionDescriptor)filterContext.ActionDescriptor;
        var attributes = controlActionDescriptor.MethodInfo.CustomAttributes;
        if (attributes.Any(a => a.AttributeType == typeof(InitializingActionAttribute)))
        {
            var vals = filterContext.ActionArguments.Values;
            var fistobj = vals.FirstOrDefault();
            var val = fistobj.GetType().GetProperties().FirstOrDefault(x => string.Equals(x.Name, "nameParameter", StringComparison.OrdinalIgnoreCase)).GetValue(fistobj);
            if (val == null || val.ToString() != "value parameter")
            {
                filterContext.Result = new JsonResult(ExecuteResult.Fail(JanException.Parameter.API00001));
                //base.OnActionExecuting(filterContext);
                return;
            }
        }
        base.OnActionExecuting(filterContext);
    }

可以从OnActionExecuting中的ActionArguments访问它

public override void OnActionExecuting(ActionExecutingContext context) {
    string id = context.ActionArguments["id"].ToString();
    //...
}

这也通过ActionExecutingContext.ActionParameters属性公开。ActionParameters属性允许您查看或更改实际传递给action方法的参数。@Levi您应该将此作为答案发布
public override void OnActionExecuting(ActionExecutingContext context) {
    string id = context.ActionArguments["id"].ToString();
    //...
}