6

से पहले किसी नए लॉग-इन किए गए उपयोगकर्ता की प्रोफ़ाइल को लोड करने के लिए कैसे मैंने एक एएसपी.नेट एमवीसी 2 प्रोजेक्ट शुरू किया और मैं स्वचालित रूप से जेनरेट किए गए कोड से बाहर हूं।रीडायरेक्ट

समस्या जो मैं अनुभव कर रहा हूं वह यह है कि उपयोगकर्ता लॉग इन होने के बाद, ऐसा लगता है कि नए लॉग-इन किए गए उपयोगकर्ता की प्रोफ़ाइल HttpContext में लोड नहीं की गई है, इसलिए मुझे संदेश के साथ ProviderException मिलता है अज्ञात उपयोगकर्ताओं के लिए सेट नहीं किया जा सकता है "जब वर्तमान उपयोगकर्ता की प्रोफ़ाइल में संपत्ति मान सेट करने का प्रयास किया जा रहा है।

बाद केवल बादलॉगऑनटैब कार्रवाई के लिए, विजुअल वेब डेवलपर 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); 
     //... 

जहां FormsService प्रकार FormsAuthenticationService (भी उत्पन्न किया था) के नियंत्रक की संपत्ति है:

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) लाइन के बाद मैं यह मान रहा था कि नए लॉग-इन खाते की जानकारी तुरंत नियंत्रक के लिए उपलब्ध होगी, लेकिन ऐसा नहीं लगता है। यदि, उदाहरण के लिए, मैं फॉर्म सेवा # साइनइन पर कॉल के नीचे profile.SetPropertyValue("MyProfileProperty", "test") जोड़ता हूं, तो मुझे ProviderException मिलता है "यह गुण अज्ञात उपयोगकर्ताओं के लिए सेट नहीं किया जा सकता"।

मैं HttpContext में नए लॉग-इन किए गए उपयोगकर्ता की प्रोफ़ाइल कैसे लोड करूं ताकि मैं अगले अनुरोध से पहले अपनी प्रोफ़ाइल में संपत्ति मूल्य निर्धारित कर सकूं?

उत्तर

6

समारोह के नामकरण काउंटर सहज ज्ञान युक्त है, लेकिन ProfileBase.Create (उपयोगकर्ता नाम) एक मौजूदा उपयोगकर्ता के लिए मौजूदा प्रोफ़ाइल को लोड या यदि कोई भी मौजूद है एक नया प्रोफ़ाइल बनाने होंगे।

var profile = ProfileBase.Create(userName); 

यह ControllerContext.HttpContext.Profile में प्रोफ़ाइल को लोड नहीं होगा, लेकिन कम से कम आप का उपयोग करें या उपयोगकर्ता प्रोफाइल बदल सकते हैं।

+0

यह एक नई प्रोफ़ाइल बनाएगा, मौजूदा लोड नहीं करेगा। –

+0

नहीं, आप यह मानना ​​गलत हैं कि यह एक मौजूदा प्रोफ़ाइल लोड करेगा। कोशिश करके देखो। –

+1

"मुझे कुछ समय लगेगा जब तक मुझे एहसास हुआ कि प्रोफ़ाइलबेस के साथ प्रोफाइलबेस.क्रेट() को कॉल करना तर्क के रूप में उपयोगकर्ता नाम के साथ एक लुकअप करता है और वास्तव में उस उपयोगकर्ता नाम से जुड़े डेटा को पुनर्प्राप्त करता है। जहां तक ​​मेरा संबंध है, इस विधि को कॉल करना() भ्रामक है, मैं लोड() या प्राप्त() प्राप्त करने की उम्मीद करेंगे। " इस प्रश्न का उत्तर देखें: http://stackoverflow.com/questions/1126719/asp-net-sql-profile-provider-does-the-profilebase-create-method-hit-db –

1

एमवीसी टेम्पलेट में निर्मित "कच्चे" फॉर्म प्रमाणीकरण स्वचालित रूप से प्रोफ़ाइल लोड नहीं करता है। यह सब सदस्यता तालिका के खिलाफ उपयोगकर्ता को मान्य करता है और लॉगिन कुकी सेट करता है। यदि आप चाहते हैं प्रोफ़ाइल डेटा प्रवेश पर सेशन स्टेट में जारी रही, आपको लगता है कि स्पष्ट रूप से करना होगा:

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

अद्यतन:

मैं मूल प्रश्न को गलत समझा। आपको अज्ञात उपयोगकर्ताओं के लिए ProfileCommon प्रकार की प्रोफ़ाइल बनाना और सहेजना होगा। यह पोस्ट देखें:

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

+0

मैं प्रोफ़ाइल मान रहा हूं तो सत्र में लोड किया जाता है जब "अगला" पृष्ठ लॉग इन करने के बाद लोड किया जाता है। क्या यह सही है? –

+0

@ निक: इस कार्यान्वयन में, प्रोफ़ाइल को रीडायरेक्ट से पहले सत्यापन पर तुरंत सत्र में लोड किया जाता है। –

+0

यह एक बेवकूफ सवाल हो सकता है, लेकिन यह नए लॉग-इन उपयोगकर्ता के प्रोफाइल ('ControllerContext.HttpContext.Profile') को कैसे लोड करता है? –