KentZhou
KentZhou

Reputation: 25553

How to get parameter in OnActionExecuting?

I modify the default route rule a little bit as below:

routes.MapRoute(
  "Default",                                              // Route name
  "{controller}/{action}/{id}",                           // URL with parameters
  new { controller = "Home", action = "Index", id= (string)null }  // Parameter defaults
);

Then I can set url as:

/Controller/Action/myParam
/Home/Index/MyParam

The default Action Index would be:

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

I can get the param in action. But I want to get the param in OnActionExecuting. How can I do it?

Upvotes: 13

Views: 16735

Answers (5)

Nayeem Bin Ahsan
Nayeem Bin Ahsan

Reputation: 471

It can be accessible from ActionArguments inside OnActionExecuting.

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

Upvotes: 1

it dũng
it dũng

Reputation: 47

I use the following code to retrieve and compare the parameters passed to an action (.net core 3.1).

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

More details for OnActionExecuting and a custom Attribute InitializingActionAttribute

    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);
    }

Upvotes: 0

Sonic Soul
Sonic Soul

Reputation: 24919

if you want to get controller, action, and all parameters, you can do this

    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 

results with:

"/Get/Customer/215840"

it should work on multiple parameters just as well.

Upvotes: 0

Freddy
Freddy

Reputation: 3274

From your filterContext you should be able to get whatever you need.


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

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

Upvotes: -6

Çağdaş Tekin
Çağdaş Tekin

Reputation: 16651

You should be able to access it with :

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

Upvotes: 29

Related Questions