我能从HttpContext中访问ViewData吗?

3
我正在处理一个项目,该项目在其授权操作过滤器中设置变量,例如当前用户配置文件对象,并将它们存储在ViewData中以便后续操作方法访问。
然后,操作方法调用存储库的功能。我正在尝试找到一种方法来从存储库不修改存储库方法签名的情况下访问ViewData,并希望能够通过HttpContext.Current功能追溯到它。
有人可以帮忙吗?为了明确起见,我只能修改存储库方法内部的代码:(
public class MyController : Controller {
    [MyAuthorize]                   // ViewData items are set here
    public void MyAction(int id)
    {
        new MyRepository().DoSomething(id); // Need to access ViewData items within this repository method and am unable to alter the method signature :(
    }
}

所以这是在到达仓库之前的过滤器中吗? - user156888
没问题,我会发布一个代码示例。谢谢。 - Jimbo
你唯一能做到这一点的方法是将ViewData注册到IoC或其他地方,并从存储库内部解决它...虽然这听起来不太干净。 - user156888
1个回答

1
我相信答案是“否”。
当您审查ASP.NET MVC源代码时,ControllerBase在首次使用时实例化一个ViewData字典。然后当您调用View()时,会实例化一个新的ViewResult,并将ControllerBase.ViewData字典作为参数传递。它似乎没有应用于公共静态属性或类,如HttpContext,您无法从存储库内部访问它。
我认为最好的方法是使用HttpContext.Items,它专为此类通信而设计。虽然可能不像只修改存储库以接受额外数据那样理想。

如果你在过滤器中获取了ViewData并将其放在某个静态位置,那么以后就可以抓取它,但是这样做会很混乱。 - user156888

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接