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