【问题标题】:Accessing Action Filter's data in Controller Action在 Controller Action 中访问 Action Filter 的数据
【发布时间】:2011-08-12 11:08:30
【问题描述】:
[ApiBasicAuthorize]
public ActionResult SignIn()
{

}

我有一个名为 ApiBasicAuthorize 的自定义过滤器。是否可以在控制器操作 SignIn 中访问 ApiBasicAuthorize 的数据(属性等)?

如果没有,我如何将数据从过滤器传递到控制器操作?

【问题讨论】:

  • 您在 authrize_Attribute 中覆盖了哪种方法。您可以向路由字典添加数据,向我们展示您的更多代码。
  • 我正在重写 OnAuthorization(AuthorizationContext filterContext) 方法。

标签: asp.net-mvc


【解决方案1】:

有一个名为 items 的字典附加到 HttpContext 对象。使用此字典存储请求期间跨组件共享的项目。

public override void OnAuthorization(AuthorizationContext filterContext)
{
    filterContext.HttpContext.Items["key"] = "Save it for later";

    base.OnAuthorization(filterContext);
}

然后在请求中稍后的代码中的任何位置...

var value = HttpContext.Current.Items["key"];

【讨论】:

  • 即使 Praveen 的答案也有效,但我已将此标记为答案,因为 HttpContext.Items 更适合此目的,而不是 RouteData.Values
  • @goths - 你好,你能解释一下为什么你选择HttpContext.Items而不是RouteData吗?另请参阅:stackoverflow.com/a/1809541/538387 谢谢
  • 嗨@goths,是的,我也很好奇为什么前者比后者更“合适”?似乎它们都服务于相同的目的,所以想知道是什么限制或意图将两者分开?
  • 问题。是 HttpContext.Items 的值是线程安全的。是如果我在多个操作中使用自定义过滤器属性并同时调用它,我们如何确保正确的控制器操作将获得正确的数据?
【解决方案2】:
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        var rd = filterContext.RouteData;

        //add data to route
        rd.Values["key"]="Hello";

        base.OnAuthorization(filterContext);
    }



public ActionResult(string key)
{
 //key= Hello
return View();
}

【讨论】:

    猜你喜欢
    • 2016-12-22
    • 1970-01-01
    • 2021-07-07
    • 2013-01-28
    • 2013-01-09
    • 2017-06-30
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    相关资源
    最近更新 更多