2010-01-02 24 views
0

我有这样的代码示例:获取当前用户实体在ASP.Net MVC

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> 
<% 
    if (Request.IsAuthenticated) { 
%> 
     Welcome <b><%= Html.Encode(Page.User.Identity.Name) %></b>! 

美中不足的是我把用户的ID,而不是命名为“用户名”栏:

User user = _userRepository.Get(...); 
FormsAuthentication.RedirectFromLoginPage(user.Id.ToString(), false); 

第一个代码示例包含在主视图中,因此会出现在每个视图中。我不明白的是如何将该视图传递给用户模型实体,因为我没有直接调用它。

编辑:处理HTTP请求时是否存在单点问题,我可以介入将User模型对象插入到ViewData中?我不想触摸每一个控制器+动作来实现这一点。

回答

1

最常见的解决方法是将用户存储在会话变量中。我会说这也是最流行的方式,即使在ASP.NET MVC。

在一个实用工具类或自定义页面/用户控件的基类:

const string _userSessionKey = "CurrentUser_"; 
public UserModelType CurrentUser 
{ 
    var user = HttpContext.Current.Session[_userSessionKey] as UserModelType; 
    if(user == null) 
    { 
     if(HttpContext.Current.User.Identity.IsAuthenticated) 
     { 
      //new UserService() or DependencyContainer.Resolve<IMembershipService>() 
      user = new MembershipService().GetUserById(HttpContext.Current.User.Identity.Name); 
      HttpContext.Current.Session[_userSessionKey] = user; 
     } 
    } 

    return user; 
} 

我知道了!
这太经典了,可能不是MVC-ish,但通常我会看到类似的实现。

保持MVC友好的最重要的事情是从控制器中调用该代码。您可以使用输出用户控件左右的部分控制器(有一种RenderAction方法,我认为它是最好的部分之一)。所以视图只传递用户或用户模型的名称,而不直接调用它。这就是为什么这里的实用程序类比基本页面/控件类好得多,但总体上有一些选项。

如果你想你应该寻找类似的东西更好:

ASP.Net MVC Membership Starter Kit

+0

但是我需要从每个控制器调用此代码,然后违反DRY? – ripper234 2010-01-05 23:14:04

+0

不! 您可以在实用程序类中创建它,并从部分控制器(其视图是用户控件)进行调用。 然后,您需要在任何需要显示此视图的视图中调用RenderAction <>()方法,通常在母版页中不在视图中。 如果您以后需要从其他控制器访问其他用途的用户,请调用该实用程序类的属性。 – Meligy 2010-01-06 06:42:22

+0

你有其他疑虑吗?你试过它并使它工作? – Meligy 2010-01-12 14:45:31

1

我已经谈妥上创造几乎每个视图具体型号从派生的主视图模型类。主模型包含每个视图可能需要的信息。我尽量保持这些信息非常小,并将其缓存在会话中,以便填充模型不是一个密集的操作。该模型实现了一个接口,以便每个特定于视图的模型都可以实现此接口,因此,如果我只关心基本信息,则可以轻松创建接受接口的强类型视图。我为我的所有控制器使用了基本控制器,并且在基本控制器上实现了用于填充基本模型的代码。每个特定的视图模型都有一个构造函数,它接受基础模型接口并将数据复制到本地实例。

1

您可以确保每个控制器/页面/控件都实现了一个基类,您可以在其中公开您的模型数据。

这很容易变得很痛苦,但传递一个ViewModel比从页面本身触发HttpContext更清晰。

编辑:这是我可能倾向于使用ViewData [“username”]并在MasterPage中使用它的少数情况之一,至少这样只有基类需要填充这个和您可以避免在整个控制器中进行身份验证。

+0

在处理HTTP请求时,我可以介入将User模型对象注入ViewData吗?我不想触摸每一个控制器+动作来实现这一点。 – ripper234 2010-01-05 21:35:01