如何将参数从动作过滤器传递到MVC中的控制器操作?

时间:2017-05-25 13:14:25

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

有一天试图弄清楚如何将参数从动作过滤器传递给控制器​​动作,但没有运气。我去过this问题并尝试了两个答案。 当我调试我的应用程序时,我没有得到控制器动作参数的值,它总是为空。

这是动作过滤器......

public class FacebookCheckPermission : ActionFilterAttribute
    {
        public string redirectURL { get; set; }
        public async  override void OnActionExecuting(ActionExecutingContext filterContext)
        {
                var myBaseController = (BaseController)filterContext.Controller;
                PermissionRequestViewModel permissionViewModel = myBaseController.GetMissingPermissions();

                filterContext.RouteData.Values.Add("Value1", "Hi");

                filterContext.ActionParameters["Value2"] = "Bye";

                if (permissionViewModel != null &&
                    permissionViewModel.MissingPermissions.Count > 0)
                //Code removed for brevity.

                base.OnActionExecuting(filterContext);
        }

    }

这是控制器行动:

[FacebookCheckPermission]
public async Task<ActionResult> Index(string Value1, string Value2)
{

更新 似乎我发现了问题。问题是我的Action过滤器是async,我有一些API调用Facebook。如果我在API调用之前的任何地方声明它,我可以获取我的动作过滤器参数但是当我在API调用下声明它时,我的动作参数变为null。可能是什么问题?

这是对facebook图形API的调用。 dynamic myInfo = await fb.GetTaskAsync("me?fields=id,first_name,last_name,link,locale,email,name,birthday,gender,location,age_range,about".GraphAPICall(appsecret_proof));

2 个答案:

答案 0 :(得分:0)

您还可以使用RouteData值。

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
    filterContext.RouteData.Values.Add("MyParam", "ParamValue");
}

然后在控制器中。

   var paramValue = RouteData.Values["MyParam"].ToString();

有一个&#34; clunkier&#34;方法...我在控制器顶部放置了一个私有var,在OnActionExecuting中分配给它,然后在我的action方法中使用该var。

希望有所帮助。

答案 1 :(得分:-1)

使用ActionParameters

 public class FacebookCheckPermission : ActionFilterAttribute
    {
        public string redirectURL { get; set; }

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            filterContext.ActionParameters["Value1"] = "Hi";
            filterContext.ActionParameters["Value2"] = "Bye";

            base.OnActionExecuting(filterContext);
        }

    }

        [FacebookCheckPermission]
        public Task<ActionResult> Index(string Value1, string Value2)
        {
            string lol = $"{Value1} - {Value2}";
            return null;

        }

首先使用简单的添加ActionParameters,工作正常,然后添加其他代码, ActionParameters 没有任何问题。