प्रोफ़ाइल मान कैसे निर्दिष्ट करें?


110

मुझे नहीं पता कि मैं क्या याद कर रहा हूं, लेकिन मैंने Web.config फ़ाइल में प्रोफ़ाइल गुण जोड़े, लेकिन प्रोफ़ाइल तक नहीं पहुंच सकता। कोड में आइटम या एक नया प्रोफ़ाइल बनाएं।

जवाबों:


179

मुझे आज भी यही समस्या थी, और मैंने बहुत कुछ सीखा।

विज़ुअल स्टूडियो में दो तरह के प्रोजेक्ट हैं - "वेब साइट प्रोजेक्ट्स" और "वेब एप्लीकेशन प्रोजेक्ट्स।" जो कारण मेरे लिए पूर्ण रहस्य हैं, वेब एप्लिकेशन प्रोजेक्ट्स प्रोफ़ाइल का उपयोग नहीं कर सकते हैं सीधे ... दृढ़ता से टाइप की गई क्लास आपके लिए Web.config फ़ाइल से जादुई रूप से उत्पन्न नहीं होती है, इसलिए आपको अपना रोल करना होगा।

MSDN में नमूना कोड मानता है कि आप एक वेब साइट परियोजना का उपयोग कर रहे हैं, और वे आपको संपत्ति के साथ <profile>अपने Web.configऔर पार्टी के लिए एक अनुभाग जोड़ने के लिए कहते Profile.हैं , लेकिन यह वेब अनुप्रयोग परियोजनाओं में काम नहीं करता है।

आपके पास अपना रोल करने के लिए दो विकल्प हैं:

(1) वेब प्रोफाइल बिल्डर का उपयोग करें । यह एक कस्टम टूल है जिसे आप विज़ुअल स्टूडियो में जोड़ते हैं, जो Web.config में आपकी परिभाषा से आपके द्वारा आवश्यक प्रोफ़ाइल ऑब्जेक्ट को स्वचालित रूप से जेनरेट करता है।

मैंने ऐसा करने के लिए नहीं चुना, क्योंकि मैं नहीं चाहता था कि मेरा कोड संकलन करने के लिए इस अतिरिक्त टूल पर निर्भर हो, जो लाइन के नीचे किसी और के लिए समस्या पैदा कर सकता था जब उन्होंने इस कोड को यह महसूस किए बिना मेरे कोड को बनाने की कोशिश की कि उन्हें इस उपकरण की आवश्यकता है।

(२) अपनी स्वयं की कक्षा बनाएँ जो ProfileBaseआपके कस्टम प्रोफ़ाइल का प्रतिनिधित्व करने के लिए हो। ऐसा लगता है की तुलना में आसान है। यहाँ एक बहुत ही सरल उदाहरण है जो "FullName" स्ट्रिंग प्रोफ़ाइल फ़ील्ड जोड़ता है:

अपने web.config में:

<profile defaultProvider="SqlProvider" inherits="YourNamespace.AccountProfile">

<providers>
     <clear />
     <add name="SqlProvider"
          type="System.Web.Profile.SqlProfileProvider"
          connectionStringName="sqlServerMembership" />
</providers>

</profile>

AccountProfile.cs नामक फ़ाइल में:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Profile;
using System.Web.Security;

namespace YourNamespace
{
    public class AccountProfile : ProfileBase
    {
        static public AccountProfile CurrentUser
        {
            get { return (AccountProfile)
                         (ProfileBase.Create(Membership.GetUser().UserName)); }
        }

        public string FullName
        {
            get { return ((string)(base["FullName"])); }
            set { base["FullName"] = value; Save(); }
        }

        // add additional properties here
    }
}

प्रोफ़ाइल मान सेट करने के लिए:

AccountProfile.CurrentUser.FullName = "Snoopy";

एक प्रोफ़ाइल मान प्राप्त करने के लिए

string x = AccountProfile.CurrentUser.FullName;

10
खुद StackOverflow प्रोफाइल का उपयोग नहीं करता है। यह कोड शायद एक दिन में 1,000,000 पृष्ठों वाले साइट के लिए पर्याप्त तेज़ नहीं है। जब मैंने यह लिखा था तब मैं एक और प्रोजेक्ट पर काम कर रहा था।
योएल Spolsky

1
यह मेरी खुद की गलती है, लेकिन मैं करंट यूसर को कॉल करने के बाद प्रॉपर्टी सेट करने में काफी समय से जूझ रहा था। चूंकि CurrentUser हर बार एक नया उदाहरण देता है और वापस आता है, क्या मैं इसके बजाय इसे एक विधि के रूप में परिभाषित करने का सुझाव दे सकता हूं? बिना सोचे-समझे मैंने यह लिखा: AccountProfile.CurrentUser.FullName = "Snoopy"; AccountProfile.CurrentUser.OtherProperty = "ABC"; AccountProfile.CurrentUser.Save (); जो काम नहीं करता है। यह होना चाहिए: AccountProfile currentProfile = AccountProfile.CurrentUser; currentProfile.FullName = "स्नूपी"; currentProfile.OtherProperty = "ABC"; currentProfile.Save ();
जेरेमी ग्रुएनवाल्ड 14

1
प्रोफ़ाइल के पूरे उद्देश्य को इस तरह से नहीं हराता है? आप "Profile.MyProperty" का उपयोग नहीं कर सकते हैं, आपको अपने स्वयं के घर में रहने वाले वर्ग का उपयोग करना होगा, जो हर पृष्ठ पर सेट नहीं किया जाता है जिस तरह से प्रोफ़ाइल स्वचालित रूप से है। यह सब करता है आप इसे बचाने के लिए बिना सेव () सुविधा का उपयोग करते हैं।
माइक के

7
वेब एप्लिकेशन प्रोजेक्ट्स प्रोफ़ाइल का उपयोग नहीं कर सकते हैं।
योएल Spolsky

2
यदि आप गलती से वेब कॉन्फ़िगरेशन में प्रोफ़ाइल गुणों के <profile ..><properties><add name="..">साथ-साथ AccountProfile वर्ग के तहत परिभाषित करते हैं, तो आपको web.config में गुणों को हटाकर "यह गुण पहले से परिभाषित किया गया है," आसानी से मिल जाएगा।
ज़ाचरी स्कॉट

17

वेब एप्लिकेशन प्रोजेक्ट्स अभी भी ProfileCommon ऑब्जेक्ट का उपयोग कर सकते हैं लेकिन केवल रनटाइम पर। इसके लिए कोड सिर्फ प्रोजेक्ट में ही उत्पन्न नहीं होता है, बल्कि वर्ग ASP.Net द्वारा उत्पन्न होता है और रनटाइम पर मौजूद होता है।

ऑब्जेक्ट को प्राप्त करने का सबसे सरल तरीका एक गतिशील प्रकार का उपयोग करना है जैसा कि नीचे दिखाया गया है।

Web.config फ़ाइल में प्रोफ़ाइल गुण घोषित करें:

<profile ...
 <properties>
   <add name="GivenName"/>
   <add name="Surname"/>
 </properties>

फिर गुणों तक पहुँचने के लिए:

dynamic profile = ProfileBase.Create(Membership.GetUser().UserName);
string s = profile.GivenName;
profile.Surname = "Smith";

प्रोफ़ाइल गुणों में परिवर्तन सहेजने के लिए:

profile.Save();

यदि आप गतिशील प्रकारों का उपयोग करने में सहज हैं और संकलन-समय की जाँच और अंतर्मुखता की कमी का ध्यान नहीं रखते हैं तो उपरोक्त कार्य ठीक है।

यदि आप ASP.Net MVC के साथ इसका उपयोग करते हैं, तो आपको कुछ अतिरिक्त कार्य करने होंगे यदि आप अपने प्रोफ़ाइल के डायनामिक प्रोफ़ाइल ऑब्जेक्ट को पास करते हैं क्योंकि HTML सहायक विधियाँ "मॉडल" ऑब्जेक्ट के साथ अच्छी तरह से नहीं खेलती हैं जो गतिशील हैं। एचटीएमएल हेल्पर के तरीकों से गुजरने से पहले आपको प्रोफ़ाइल गुणों को वैधानिक रूप से टाइप किए गए चर पर असाइन करना होगा।

// model is of type dynamic and was passed in from the controller
@Html.TextBox("Surname", model.Surname) <-- this breaks

@{ string sn = model.Surname; }
@Html.TextBox("Surname", sn); <-- will work

यदि आप एक कस्टम प्रोफ़ाइल वर्ग बनाते हैं, जैसा कि जोएल ने ऊपर वर्णित किया है, ASP.Net अभी भी ProfileCommon वर्ग उत्पन्न करेगा लेकिन यह आपके कस्टम प्रोफ़ाइल वर्ग से विरासत में मिलेगा। यदि आप एक कस्टम प्रोफ़ाइल वर्ग निर्दिष्ट नहीं करते हैं तो ProfileCommon System.Web.Profile.ProfileBase से इनहेरिट करेगा।

यदि आप अपना स्वयं का प्रोफ़ाइल वर्ग बनाते हैं, तो सुनिश्चित करें कि आप Web.config फ़ाइल में प्रोफ़ाइल गुण निर्दिष्ट नहीं करते हैं जो आपने पहले ही अपने कस्टम प्रोफ़ाइल वर्ग में घोषित किया है। यदि आप ASP.Net करते हैं, तो जब यह ProfileCommon वर्ग उत्पन्न करने की कोशिश करता है तो एक संकलक त्रुटि देगा।


मैं प्रोफ़ाइल नहीं बचा सकता। त्रुटि यह है: 'ProfileCommon' में 'सेव' के लिए परिभाषा नहीं है
जिमी

2
@Salman: ProfileCommon System.Web.Profile.ProfileBase से लिया गया है जिसमें एक सेव () विधि है। कृपया जांचें कि आपका पूंजीकरण सही है। देखें: msdn.microsoft.com/en-us/library/…
colivier

13

प्रोफ़ाइल का उपयोग वेब अनुप्रयोग परियोजनाओं में भी किया जा सकता है। गुणों को डिज़ाइन समय या प्रोग्रामिक रूप से Web.config में परिभाषित किया जा सकता है। Web.config में:

<profile enabled="true" automaticSaveEnabled="true" defaultProvider="AspNetSqlProfileProvider">
      <providers>
        <clear/>
        <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="TestRolesNProfiles"/>
      </providers>
      <properties>
        <add name="FirstName"/>
        <add name="LastName"/>
        <add name ="Street"/>
        <add name="Address2"/>
        <add name="City"/>
        <add name="ZIP"/>
        <add name="HomePhone"/>
        <add name="MobilePhone"/>
        <add name="DOB"/>

      </properties>
    </profile>

या प्रोग्राम एक instantiating द्वारा प्रोफ़ाइल अनुभाग बनाने ProfileSection और का उपयोग कर अलग-अलग प्रॉपर्टी बनाने ProfilePropertySettings और ProfilePropertySettingsColletion , जो सभी के System.Web.Configuration नाम स्थान में हैं। प्रोफ़ाइल के उन गुणों का उपयोग करने के लिए, System.Web.Profile.ProfileBase ऑब्जेक्ट का उपयोग करें। प्रोफ़ाइल गुणों को प्रोफ़ाइल के साथ एक्सेस नहीं किया जा सकता है वाक्य रचना जैसा कि ऊपर उल्लेख है, लेकिन आसानी से एक ProfileBase instantiating और का उपयोग करके किया जा सकता है SetPropertyValue ( " PropertyName ") और GetPropertyValue { " PropertyName ") इस प्रकार है:

ProfileBase curProfile = ProfileBase.Create("MyName");

या वर्तमान उपयोगकर्ता की प्रोफ़ाइल तक पहुँचने के लिए:

ProfileBase curProfile = ProfileBase.Create(System.Web.Security.Membership.GetUser().UserName);



        curProfile.SetPropertyValue("FirstName", this.txtName.Text);
        curProfile.SetPropertyValue("LastName", this.txtLname.Text);
        curProfile.SetPropertyValue("Street", this.txtStreet.Text);
        curProfile.SetPropertyValue("Address2", this.txtAdd2.Text);
        curProfile.SetPropertyValue("ZIP", this.txtZip.Text);
        curProfile.SetPropertyValue("MobilePhone", txtMphone.Text);
        curProfile.SetPropertyValue("HomePhone", txtHphone.Text);
        curProfile.SetPropertyValue("DOB", txtDob.Text);
        curProfile.Save();

1
मुझे नहीं पता कि इसे 1000 वोट क्यों नहीं मिले। यह बेहद मददगार है।
pgcpa

मुझे लगता है कि कोई भी परेशान नहीं है। यह सोना है, धन्यवाद बेड! ऊपर दिए गए डेटा को सहेजने के बाद, मैं एक नई ProfileBaseवस्तु बनाकर और आह्वान करके उपयोगकर्ता के डेटा को कहीं से भी एक्सेस कर सकता हूं GetPropertyValue("PropName")?
देखिए बिस्किट

कमाल है, यह एकमात्र तरीका है जो मेरे लिए काम करता है। थन्स बेडे
इमानुएल पिरोवानो

पहली समस्या, मैं दूसरे पेज में कैसे उपयोग कर सकता हूं?
इमानुएल पिरोवानो

8

जब आप विज़ुअल स्टूडियो में एक नई वेब साइट परियोजना बनाते हैं, तो प्रोफ़ाइल से लौटी हुई वस्तु आपके लिए उत्पन्न (स्वचालित रूप से) होगी। जब आप एक वेब एप्लिकेशन प्रोजेक्ट या MVC प्रोजेक्ट बनाते हैं, तो आपको अपना स्वयं का रोल करना होगा।

यह शायद इससे कहीं अधिक कठिन लगता है। आपको निम्नलिखित करने की आवश्यकता है:

  • Aspnet_regsql.exe का उपयोग करके एक डेटाबेस बनाएं। यह उपकरण .NET फ्रेमवर्क के साथ स्थापित किया गया है।
  • एक वर्ग लिखें जो ProfileGroupBase से निकलता है या वेब प्रोफ़ाइल बिल्डर (WPB) स्थापित करता है जो आपके लिए Web.Config में परिभाषा से वर्ग उत्पन्न कर सकता है। मैं थोड़ी देर के लिए WPB का उपयोग कर रहा हूं और अब तक उसने वही किया है जो उससे अपेक्षित है। यदि आपके पास बहुत सारे गुण हैं, तो WPB का उपयोग करके समय की काफी बचत कर सकते हैं।
  • सुनिश्चित करें कि डेटाबेस से कनेक्शन ठीक से Web.Config में कॉन्फ़िगर किया गया है।
  • अब आप अपने प्रोफ़ाइल वर्ग (नियंत्रक में) का एक उदाहरण बनाने के लिए तैयार हैं
  • आपको अपने विचारों में प्रोफ़ाइल संपत्ति मूल्यों की आवश्यकता होगी। मैं प्रोफ़ाइल ऑब्जेक्ट को दृश्य के साथ ही पास करना पसंद करता हूं (व्यक्तिगत गुण नहीं)।

3

यदि आप वेब एप्लिकेशन प्रोजेक्ट का उपयोग कर रहे हैं, तो आप डिज़ाइन-टाइम आउट-ऑफ़-द-बॉक्स पर प्रोफ़ाइल ऑब्जेक्ट तक नहीं पहुँच सकते। यहाँ एक उपयोगिता है जो माना जाता है कि यह आपके लिए है: http://weblogs.asp.net/joewrobel/archive/2008/02/03/web-profile-builder-for-web-application-projects.aspx । व्यक्तिगत रूप से, उस उपयोगिता ने मेरी परियोजना में एक त्रुटि का कारण बना इसलिए मैंने अपनी प्रोफाइल क्लास को प्रोफाइलबेस से विरासत में प्राप्त करना शुरू कर दिया। ऐसा करना बिल्कुल भी मुश्किल नहीं था।


3
System.Web.Profile - यहाँ कुछ नमूना कोड है: weblogs.asp.net/jgalloway/archive/2008/01/19/…
nshaw


2

मैं भी उसी मुद्दे से गुजर रहा था। लेकिन प्रोफाइलबेस से विरासत में मिली एक क्लास बनाने के बजाय, मैंने HttpContext का उपयोग किया।

Web.config फ़ाइल में गुण निर्दिष्ट करें: - ProfilePropertyWeb.config

अब, निम्नलिखित कोड लिखें: -

प्रोफाइल गुणों के पीछे कोड

कोड संकलित करें और चलाएं। आपको निम्नलिखित आउटपुट मिलेंगे: -

उत्पादन


1

वेब प्रोफाइल बिल्डर मेरे लिए महान काम किया। जोएल ने जो पद सृजित किया है, उसकी तुलना में यह वर्ग बहुत अधिक है। मैं वास्तव में जरूरत है या उपयोगी है या नहीं, मुझे नहीं पता।

वैसे भी उन लोगों के लिए जो क्लास उत्पन्न करने का एक आसान तरीका खोज रहे हैं, लेकिन एक बाहरी बिल्ड टूल निर्भरता नहीं चाहते हैं जो आप हमेशा कर सकते हैं

  • वेब प्रोफ़ाइल बिल्डर का उपयोग करें
  • इसे हटा दें!
  • उत्पन्न प्रोफ़ाइल वर्ग का उपयोग करते रहें

या (निष्कलंक लेकिन सिर्फ काम कर सकते हैं)

  • एक वेब साइट परियोजना बनाएँ
  • अपना तत्व बनाएं
  • उत्पन्न वर्ग को स्नैप करें और इसे अपने वेब प्रोजेक्ट प्रोजेक्ट पर कॉपी करें

अगर यह दूसरा तरीका काम करता है तो कोई मुझे भविष्य के संदर्भ के लिए बता सकता है


1

बस जोएल स्पोल्स्की के जवाब में जोड़ना चाहते हैं

मैंने उसका समाधान कार्यान्वित किया, शानदार ढंग से काम करते हुए btw - कुडोस!

उपयोगकर्ता प्रोफ़ाइल प्राप्त करने के इच्छुक किसी भी व्यक्ति के लिए, जिसका मैंने उपयोग किया उपयोगकर्ता नहीं है:

web.config:

  <connectionStrings>
    <clear />
    <add name="LocalSqlConnection" connectionString="Data Source=***;Database=***;User Id=***;Password=***;Initial Catalog=***;Integrated Security=false" providerName="System.Data.SqlClient" />
  </connectionStrings>

तथा

<profile defaultProvider="SqlProvider" inherits="NameSpace.AccountProfile" enabled="true">
  <providers>
    <clear/>
    <add name="SqlProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="LocalSqlConnection"/>
  </providers>

और फिर मेरी कस्टम क्लास:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Profile;
using System.Web.Security;

namespace NameSpace
{
    public class AccountProfile : ProfileBase
    {
        static public AccountProfile CurrentUser
        {
            get
            {
                return (AccountProfile)
                 (ProfileBase.Create(Membership.GetUser().UserName));
            }
        }

        static public AccountProfile GetUser(MembershipUser User)
        {
            return (AccountProfile)
                (ProfileBase.Create(User.UserName));
        }

        /// <summary>
        /// Find user with matching barcode, if no user is found function throws exception
        /// </summary>
        /// <param name="Barcode">The barcode to compare against the user barcode</param>
        /// <returns>The AccountProfile class with matching barcode or null if the user is not found</returns>
        static public AccountProfile GetUser(string Barcode)
        {
            MembershipUserCollection muc = Membership.GetAllUsers();

            foreach (MembershipUser user in muc)
            {
                if (AccountProfile.GetUser(user).Barcode == Barcode)
                {
                    return (AccountProfile)
                        (ProfileBase.Create(user.UserName));
                }
            }
            throw new Exception("User does not exist");
        }

        public bool isOnJob
        {
            get { return (bool)(base["isOnJob"]); }
            set { base["isOnJob"] = value; Save(); }
        }

        public string Barcode
        {
            get { return (string)(base["Barcode"]); }
            set { base["Barcode"] = value; Save(); }
        }
    }
}

एक जादू की तरह काम करता है...


0

महान पद,

बस web.config पर एक नोट यदि आप प्रोफ़ाइल तत्व में निहित विशेषता निर्दिष्ट नहीं करते हैं, तो आपको नीचे दिए गए वेब के रूप में प्रोफ़ाइल तत्व के अंदर प्रत्येक indiviudal प्रोफ़ाइल संपत्ति निर्दिष्ट करने की आवश्यकता होगी।

 <properties>
    <clear/>
    <add name="property-name-1" />
    <add name="property-name-2" />
    ..........

 </properties>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.