在ASP.Net MVC中,访问会话中存储的对象的最优雅方式是什么?

时间:2009-09-21 15:51:51

标签: asp.net-mvc

在我的asp.net mvc项目中,我在用户登录时在会话中存储了两个对象。一个是User对象(表示登录用户),另一个是Organization对象(代表用户的组织)。 / p>

我需要在每个操作方法中使用这些对象中的一个或两个。处理这个问题最优雅的方法是什么?目前,每个操作都会为每个对象获取参数,并使用自定义模型绑定器从会话中检索对象。这至少封装了会话访问,但是在每个方法签名中都有params是很烦人的。还有更好的方法吗?

这是大多数动作方法的样子。

    public ActionResult Pending(IUser CurrentUser)
    {
        var users = CurrentUser.GetMyOrgPendingUsers();
        return View(users);
    }

3 个答案:

答案 0 :(得分:1)

由于您几乎在每个操作中都需要访问IUser,因此可以从每个其他控制器派生的基础控制器中获取。 在基本控制器中将IUser作为成员变量并覆盖 基本控制器中的OnActionExecuting()方法,您可以在其中放置代码来访问会话变量。

每次调用一个动作时都会调用OnActionExecuting()。

答案 1 :(得分:0)

Controller类具有User属性。您是否考虑过使用此而不是设计自己的方式来跟踪当前用户?

答案 2 :(得分:0)

我在这里重新考虑使用IPrincipal - 它非常方便,并且允许您非常无缝地使用其他.NET身份验证位。

至于手头的问题,也许最简单的清理方法是将它们作为受保护的属性连接到基本控制器类。稍微更优雅的是创建一个用户上下文类,它引用Session(或者更好的是,你在会话中使用的任何基本接口)并从控制器中公开该类。它的主要优点是,如果需要,可以更容易地更改后备存储,并允许一般封装更多行为。