控制器传递用户信息,还是使用HttpContext.User?

时间:2009-11-28 21:15:04

标签: asp.net-mvc

我最近问了一个question关于在View中使用Page.User或HttpContext.Current.User的问题。建议我通过Controller传递用户信息?我也在其他公布的答案中看到了这一点。

为什么建议通过控制器传递用户信息而不使用Page.User或HttpContext.User?

3 个答案:

答案 0 :(得分:1)

如果您使用Selenium自动化视图测试或使用其他工具检查HTML输出,那么这只会是务实的。

如果是这种情况,在控制器中使用HTTPContext可能是一个非常糟糕的主意,因为这只会增加控制器操作和HTTPContext之间的耦合。

为了获得最大的可测试性,您可能需要设置一个控制器工厂,当MVC调用它时,可以将用户位注入控制器。这样,您的操作方法仍然与HTTPContext分离,并且您获得了可测试性。

如果您没有使用自动视图测试工具,那么您调用HttpContext.User信息并不重要,除非您在视图中执行了大量逻辑操作。例如if(HttpContext.User.IsAuthenticated)或者其他什么。如果是这种情况,您可以将其粘贴在控件中并使用RenderPartial或将逻辑位烘焙到您的视图模型中。

MVC的推荐最佳做法是尽可能使您的视图保持愚蠢。然而,我建议不要让所有关于MVC和模式的教条,以及什么不是。因为MVC没有在SubController功能中烘焙,所以很多领域都打破了MVC模式不仅鼓励,而且不可能不打破。 (参见MVC 2 RenderAction,RenderPartial,带控件的MasterPages)

答案 1 :(得分:0)

它松开了控制器与应用程序中其他类之间的耦合。通过使用更多依赖注入模式,可以提高控制器的可测试性。这是因为在您的测试中,您不需要模拟像HttpContext这样的概念,但可以简单地传入用户对象。

答案 2 :(得分:0)

控制器应提供所有必要的视图数据。这使得视图更容易测试。如果在视图中仅使用视图模型,则可以轻松编写测试:

  1. 创建视图模型。
  2. 创建视图对象。
  3. 传递模型进行查看。
  4. 渲染视图。
  5. 检查结果是否正确。
  6. 如果在视图中使用了HttpContext.Current,则必须先在测试中进行设置,这可能并不容易,并会添加其他依赖项。