जवाबों:
मुझे आज भी यही समस्या थी, और मैंने बहुत कुछ सीखा।
विज़ुअल स्टूडियो में दो तरह के प्रोजेक्ट हैं - "वेब साइट प्रोजेक्ट्स" और "वेब एप्लीकेशन प्रोजेक्ट्स।" जो कारण मेरे लिए पूर्ण रहस्य हैं, वेब एप्लिकेशन प्रोजेक्ट्स प्रोफ़ाइल का उपयोग नहीं कर सकते हैं । सीधे ... दृढ़ता से टाइप की गई क्लास आपके लिए 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;
<profile ..><properties><add name="..">
साथ-साथ AccountProfile वर्ग के तहत परिभाषित करते हैं, तो आपको web.config में गुणों को हटाकर "यह गुण पहले से परिभाषित किया गया है," आसानी से मिल जाएगा।
वेब एप्लिकेशन प्रोजेक्ट्स अभी भी 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 वर्ग उत्पन्न करने की कोशिश करता है तो एक संकलक त्रुटि देगा।
प्रोफ़ाइल का उपयोग वेब अनुप्रयोग परियोजनाओं में भी किया जा सकता है। गुणों को डिज़ाइन समय या प्रोग्रामिक रूप से 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();
ProfileBase
वस्तु बनाकर और आह्वान करके उपयोगकर्ता के डेटा को कहीं से भी एक्सेस कर सकता हूं GetPropertyValue("PropName")
?
जब आप विज़ुअल स्टूडियो में एक नई वेब साइट परियोजना बनाते हैं, तो प्रोफ़ाइल से लौटी हुई वस्तु आपके लिए उत्पन्न (स्वचालित रूप से) होगी। जब आप एक वेब एप्लिकेशन प्रोजेक्ट या MVC प्रोजेक्ट बनाते हैं, तो आपको अपना स्वयं का रोल करना होगा।
यह शायद इससे कहीं अधिक कठिन लगता है। आपको निम्नलिखित करने की आवश्यकता है:
यदि आप वेब एप्लिकेशन प्रोजेक्ट का उपयोग कर रहे हैं, तो आप डिज़ाइन-टाइम आउट-ऑफ़-द-बॉक्स पर प्रोफ़ाइल ऑब्जेक्ट तक नहीं पहुँच सकते। यहाँ एक उपयोगिता है जो माना जाता है कि यह आपके लिए है: http://weblogs.asp.net/joewrobel/archive/2008/02/03/web-profile-builder-for-web-application-projects.aspx । व्यक्तिगत रूप से, उस उपयोगिता ने मेरी परियोजना में एक त्रुटि का कारण बना इसलिए मैंने अपनी प्रोफाइल क्लास को प्रोफाइलबेस से विरासत में प्राप्त करना शुरू कर दिया। ऐसा करना बिल्कुल भी मुश्किल नहीं था।
एक कस्टम क्लास (उर्फ जोएल की विधि) बनाने के लिए MSDN वॉकथ्रू:
http://msdn.microsoft.com/en-us/magazine/cc163624.aspx
मैं भी उसी मुद्दे से गुजर रहा था। लेकिन प्रोफाइलबेस से विरासत में मिली एक क्लास बनाने के बजाय, मैंने HttpContext का उपयोग किया।
Web.config फ़ाइल में गुण निर्दिष्ट करें: -
अब, निम्नलिखित कोड लिखें: -
कोड संकलित करें और चलाएं। आपको निम्नलिखित आउटपुट मिलेंगे: -
वेब प्रोफाइल बिल्डर मेरे लिए महान काम किया। जोएल ने जो पद सृजित किया है, उसकी तुलना में यह वर्ग बहुत अधिक है। मैं वास्तव में जरूरत है या उपयोगी है या नहीं, मुझे नहीं पता।
वैसे भी उन लोगों के लिए जो क्लास उत्पन्न करने का एक आसान तरीका खोज रहे हैं, लेकिन एक बाहरी बिल्ड टूल निर्भरता नहीं चाहते हैं जो आप हमेशा कर सकते हैं
या (निष्कलंक लेकिन सिर्फ काम कर सकते हैं)
अगर यह दूसरा तरीका काम करता है तो कोई मुझे भविष्य के संदर्भ के लिए बता सकता है
बस जोएल स्पोल्स्की के जवाब में जोड़ना चाहते हैं
मैंने उसका समाधान कार्यान्वित किया, शानदार ढंग से काम करते हुए 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(); }
}
}
}
एक जादू की तरह काम करता है...
महान पद,
बस web.config पर एक नोट यदि आप प्रोफ़ाइल तत्व में निहित विशेषता निर्दिष्ट नहीं करते हैं, तो आपको नीचे दिए गए वेब के रूप में प्रोफ़ाइल तत्व के अंदर प्रत्येक indiviudal प्रोफ़ाइल संपत्ति निर्दिष्ट करने की आवश्यकता होगी।
<properties>
<clear/>
<add name="property-name-1" />
<add name="property-name-2" />
..........
</properties>