【问题标题】:How do I pass parameters from action filters to the controllers actions in MVC?如何将参数从动作过滤器传递到 MVC 中的控制器动作?
【发布时间】:2017-05-25 13:14:24
【问题描述】:

试图弄清楚如何将参数从动作过滤器传递到控制器动作,但没有运气。我去过this SO question并尝试了两个答案。 当我调试我的应用程序时,我没有得到控制器操作参数的值,它始终为空。

这里是动作过滤器...

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)
{

更新 看来我找到了问题所在。问题是我的操作过滤器是async,我有一些对 facebook 的 API 调用。如果我在 API 调用之前的任何地方声明它,我可以获得我的操作过滤器参数,但是当我在 API 调用下声明它时,我的操作参数变为空。可能是什么问题?

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

【问题讨论】:

  • 这只是例如真实的字符串名称与我在这里写的不同,我会以任何方式更改它
  • @Igor 感谢您的更正:)
  • 在更新时你问另一个问题,我建议检查答案,如果对你的问题有用,接受它,然后用正确的标题和正文问另一个问题,这就是 Stackoverflow 推荐的方式。

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


【解决方案1】:

您也可以使用 RouteData 值。

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

然后在控制器中。

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

有一个“笨拙”的方法...我在控制器的顶部放置了一个私有 var,在 OnActionExecuting 中分配给它,然后在我的操作方法中使用该 var。

希望对您有所帮助。

【讨论】:

  • Wheels73,问题已更新,请查看并让我知道您是否可以提供帮助
【解决方案2】:

使用动作参数

 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就没有问题了。

【讨论】:

  • $ 符号是什么?我从未在 MVC 中使用过它?
  • @Dawar 这是 string.format() 的 C# 6 功能,您可以使用 string.forma() 我只想检查传递的值是否正确 - string lol = string.Format("{0} - {1}", Value1, Value2);
  • 但是如果参数值变为空,我如何访问动作中的这些值?
  • @Dawar 当你使用 filterContext.ActionParameters["Value1"] = "Hi";在不为空的 ActionFilter 中,以防万一您传递了空值,例如: filterContext.ActionParameters["Value1"] = null;
  • Saeid,问题已更新,请查看并告诉我是否可以提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-19
  • 1970-01-01
  • 2012-03-03
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多