ActionExecutingContext - ActionParameters vs RouteData

RPM1984 picture RPM1984 · Nov 1, 2012 · Viewed 13.6k times · Source

Given the following code:

public class MyActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var a = filterContext.ActionParameters["someKey"];
        var b = filterContext.RouteData.Values["someKey"];          
        base.OnActionExecuting(filterContext);
    }
}

What is the difference between a and b ?

When should we be using action parameters over route data? What is the difference?

Answer

Felipe Oriani picture Felipe Oriani · Jul 3, 2013

When you use ActionParameters on OnActionExecuting, you can change the values that are sending by the client-side before processing an action, for sample:

public class MyActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.ActionParameters["customerId"] = 852;

        base.OnActionExecuting(filterContext);
    }
}

If you have an action using a customerId parameter, you will get the value setted on the action filter, since your action has the filter, for sample:

When you request any url like this: /customer/detail/123, you will get 852 value on CustomerId:

[MyAction]
public ActionResult Detail(int customerId)
{
   // customerId is 852

   return View();
}

RouteData is just about the values are on the url, processing by route tables.