有一天试图弄清楚如何将参数从动作过滤器传递给控制器动作,但没有运气。我去过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));
答案 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 没有任何问题。