6

Bir ASP.NET MVC 2 projesini başlattım ve otomatik olarak oluşturulan koddan çıkıyorum.Yeni oturum açmış bir kullanıcının profilini yeniden yönlendirmeden önce nasıl yüklerim

Karşılaştığım sorun, bir kullanıcı oturum açtıktan sonra, yeni giriş yapmış kullanıcının profilinin HttpContext'a yüklenmediği, bu nedenle "Bu özellik" iletisiyle bir ProviderException alacağıdır. mevcut kullanıcı profilinde bir özellik değeri ayarlamaya çalışırken anonim kullanıcılar için ayarlanamaz. SONRASI sadece LogOn eylem için

, Visual Web Geliştiricisi 2010 Express temelde oluşturulan:

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 (ayrıca oluşturulan) tip FormsAuthenticationService ait kumandanın bir özelliktir

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

FormsService.SignIn(model.UserName, model.RememberMe) satırından sonra, yeni giriş yapmış hesap için bilginin denetleyici için hemen kullanılabilir olduğunu varsayıyordum, ancak bu durum böyle görünmüyor. Örneğin, FormsService # SignIn çağrısı altında profile.SetPropertyValue("MyProfileProperty", "test") eklediyseniz, ProviderException "Bu özellik anonim kullanıcılar için ayarlanamaz".

Yeni oturum açan kullanıcı profilini, HttpContext içine nasıl yüklerim? Böylece, bir sonraki özelliğin öncesinde profilinde bir özellik değeri ayarlayabilir miyim?

cevap

6

fonksiyonun adlandırma sayaç sezgisel olmakla ProfileBase.Create (kullanıcı adı) Mevcut bir kullanıcının mevcut profili yüklemek veya hiçbiri varsa, yeni bir profil oluşturur: Bu yayını bakınız.

var profile = ProfileBase.Create(userName); 

Bu

ControllerContext.HttpContext.Profile içine profili yüklemez ama en azından erişmek veya kullanıcı profili değiştirebilir.

+0

Yeni bir profil oluşturacak, mevcut olanı yüklemeyecek. –

+0

Hayır, var olan bir profili yükleyeceğini varsayarsanız yanılıyorsunuz. Denemek. –

+1

"ProfileBase.Create() öğesinin argüman olarak bir kullanıcı adıyla çağrılmasının TableStorage'a karşı bir arama gerçekleştirdiğini ve gerçekte bu kullanıcı adıyla ilişkili verileri aldığını fark edene kadar biraz zaman harcadım. yanıltıcı, Load() veya Get(). Bu sorunun cevabını görmek için: http://stackoverflow.com/questions/1126719/asp-net-sql-profile-provider-does-the-profilebase-create-method-hit-db –

1

MVC şablonunda yerleşik "ham" Forms kimlik doğrulaması, profili otomatik olarak yüklemez. Tek yaptığı, kullanıcıyı Üyelik tablolarına karşı doğrulamak ve giriş çerezini ayarlamaktır. Eğer profil veri girişte Oturum halde devam istiyorsanız, açıkça yapmanız gerekecek:

[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); 
    } 

GÜNCELLEME:

Ben orijinal soruyu yanlış anladım. Anonim kullanıcılar için ProfileCommon türünde bir profil oluşturup kaydetmelisiniz.

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

+0

Oturum açtıktan sonra "sonraki" sayfa yüklendiğinde, profilin Oturum'a yüklendiğini kabul ediyorum. Bu doğru mu? –

+0

@Nick: Bu uygulamada profil, yönlendirmeden önce doğrulamanın hemen ardından oturuma yüklenir. –

+0

Bu aptalca bir soru olabilir, ancak bu yeni oturum açmış kullanıcının profilini ('ControllerContext.HttpContext.Profile') nasıl yükler? –

İlgili konular