6

之前加载一个新登录的用户的个人资料,我开始一个ASP.NET MVC 2项目,我建立关闭该自动生成的代码。如何重定向

,我遇到的问题是,用户登录后,看来的新登录的用户配置文件没有加载到HttpContext,所以我得到一个ProviderException消息“这个属性当试图在当前用户的配置文件中设置属性值时,不能为匿名用户设置。

为后只准登录行动,的Visual Web Developer 2010速成基本产生:

[HttpPost] 
    public ActionResult LogOn(LogOnModel model, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      if (MembershipService.ValidateUser(model.UserName, model.Password)) 
      { 
       FormsService.SignIn(model.UserName, model.RememberMe); 
     //... 

其中FormsServiceFormsAuthenticationService型(也产生)的控制器的特性:

public class FormsAuthenticationService : IFormsAuthenticationService 
{ 
    public void SignIn(string userName, bool createPersistentCookie) 
    { 
     if (String.IsNullOrEmpty(userName)) throw new ArgumentException("Value cannot be null or empty.", "userName"); 

     FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); 
    } 

    public void SignOut() 
    { 
     FormsAuthentication.SignOut(); 
    } 
} 

FormsService.SignIn(model.UserName, model.RememberMe)线后,我是假设该信息为新登录的账户就可以立即得到控制,但是这似乎并不如此。如果,例如,我调用FormsService#签到下面添加profile.SetPropertyValue("MyProfileProperty", "test"),然后我得到了ProviderException“这个属性不能为匿名用户可以设置”。

如何将新登录用户的配置文件加载到HttpContext中,以便我可以在下一个请求之前在他/她的配置文件中设置属性值?

回答

6

函数的命名是反直觉的,但ProfileBase.Create(用户名)将加载现有的配置文件为现有用户或者如果没有创建一个新的配置文件。

var profile = ProfileBase.Create(userName); 

这不会配置文件加载到ControllerContext.HttpContext.Profile但至少你可以访问或修改用户个人资料。

1

内置到MVC模板“原始” Forms身份验证不会自动加载配置文件。它所做的只是根据Membership表格验证用户并设置登录Cookie。如果你想在会话状态下的截面数据持续在登录时,你就必须做到这一点明确:

[HttpPost] 
    public ActionResult LogOn(LogOnModel model, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      if (MembershipService.ValidateUser(model.UserName, model.Password)) 
      { 
       FormsService.SignIn(model.UserName, model.RememberMe); 
       LoadProfile(model.UserName); 
      } 
    } 

    private void LoadProfile(string UserName) 
    { 
      MyModelContext ctx = new MyModelContext(); //EF or LINQ2SQL context 
      var user = ctx.Users.Where(u => u.UserName == UserName).FirstOrDefault(); 
      Session.Add("CurrentUser", user); 
    } 

UPDATE:

我误会了原来的问题。您必须为匿名用户创建并保存ProfileCommon类型的配置文件。看到这个帖子:

http://forums.asp.net/p/1150958/2619264.aspx

+0

我假设的轮廓,然后加载到Session时,“下一个”页面登录后加载。这是否正确? – 2011-01-19 16:00:12

+0

@Nick:在这个实现中,配置文件在重定向之前立即被加载到会话中。 – 2011-01-19 16:03:16