Можно ли получить значения параметров, используемые в методе из ActionFilter?

Предположим, что у меня есть метод контроллера следующим образом:

[Audit]
public JsonNetResult List(int start, int limit, string sort, string dir, string searchValue, SecurityInputModel securityData)
{
    ...
}

и атрибут, определенный как таковой:

[AttributeUsage(AttributeTargets.Method)]
public class AuditAttribute : ActionFilterAttribute
{

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        // auditing code here

        base.OnActionExecuted(filterContext);

    } 
}

могу ли я получить значение start/limit/sort/etc изнутри OnActionExecuted()?

Ответ 1

Вы можете получить значения параметров в OnActionExecuting, используя свойство ActionExecutingContext.ActionParameters.

Например, следующий атрибут теста записывает имена и значения параметров в ответ (класс ItemModel переопределяет ToString, чтобы просто выводить его 2 свойства):

public class CustomActionFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var response = filterContext.HttpContext.Response;

        response.Write(filterContext.ActionDescriptor.ActionName);
        response.Write("<br/>");

        foreach (var parameter in filterContext.ActionParameters)
        {
            response.Write(string.Format("{0}: {1}", parameter.Key, parameter.Value));
        }
    }
}

[CustomActionFilter]
[HttpPost]
public ViewResult Test(ItemModel model)
{
    return View(model);
}

alt text