如何将变量传递给自定义ActionFilterAttribute

时间:2015-11-17 16:06:40

标签: c# asp.net-mvc action-filter

我有什么选择将变量传递到MyCustomAttribute类?

目前该课程定义为:

public class MyCustomAttribute : ActionFilterAttribute
{
    public string MyIDParam { get; set; }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var myID = filterContext.ActionParameters[MyIDParam] as Int32?;

        // logic
    }
}

现在我的控制器中有这个:

[MyCustomAttribute(MyIDParam = "id")]
public ActionResult Report(int id)
{
    Guid userId = GetUserInfo();

    // logic
}

在这种情况下,我希望能够将iduserId传递给MyCustomAttribute课程。

这可能吗?在MyCustomAttribute方法的内容之前,Report是否未执行?

2 个答案:

答案 0 :(得分:0)

  

将变量传递到MyCustomAttribute类有哪些选择?

嗯,您正在编写MVC通过ActionFilter的自定义ActionExecutingContext。该变量包含大量可供您使用的信息。

public class MyCustomAttribute : ActionFilterAttribute
{
  public override void OnActionExecuting(ActionExecutingContext filterContext)
  {
    var myID = filterContext
      .RouteData["id"] as int?

    var user = filterContext.Controller.User;
  }
}
  

在这种情况下,我希望能够通过" id"和" userId"到MyCustomAttribute类。

不,你无法通过它们,你必须从ActionExecutingContext撤回它们。

  

在Report方法的内容之前,是否没有执行MyCustomAttribute?

也许?取决于你的覆盖方法。

ActionFilterAttribute有几个不同的点,它执行。这是一个细分:

ActionFilterAttribute.OnActionExecuting()  // Action Filter

public ActionResult Report(int id) // MVC Action is Called

ActionFilterAttribute.OnActionExecuted()  // Action Filter

ActionFiltrAttribute.OnResultExecuting()  // Action Filter

ActionResult.Execute() // MVC ActionResult Execute is Called

ActionFilterAttribute.OnResultExecuted()  // Action Filter

these methods have been available to access to all this data版本1以来,您可以看到

答案 1 :(得分:0)

您可以通过在自定义属性中添加对引用操作参数的支持来获得该功能。

[MyCustomAttribute("The parameter for id is {id}")]
public ActionResult Report(int id)
{
    Guid userId = GetUserInfo();

    ... logic ...
}

在运行时,您的自定义属性可以替换占位符的引用参数的值 因此,为了实现此功能,您只需要挂钩ActionExecuting方法来获取这些操作参数:

    private IDictionary<string, object> _parameters;
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        _parameters = filterContext.ActionParameters;
        base.OnActionExecuting(filterContext);
    }

然后在OnActionExecuted方法中,您可以创建一个变量到已处理字段。然后,您可以浏览字典中的每个参数并替换参数的值:

public override void OnActionExecuted(ActionExecutedContext filterContext)
{
    var data = MyIDParam;
    foreach(var kvp in _parameters)
    {
        data = data.Replace("{" + kvp.Key + "}", 
           kvp.Value.ToString());
    }
}