উত্তর:
আমি আজ একই সমস্যা ছিল, এবং অনেক শিখেছি।
ভিজ্যুয়াল স্টুডিওতে দুটি ধরণের প্রকল্প রয়েছে - "ওয়েব সাইট প্রকল্প" এবং "ওয়েব অ্যাপ্লিকেশন প্রকল্পগুলি"। যে কারণে আমার কাছে সম্পূর্ণ রহস্য, ওয়েব অ্যাপ্লিকেশন প্রকল্পগুলি প্রোফাইল ব্যবহার করতে পারে না । সরাসরি ... জোরালোভাবে টাইপ করা শ্রেণিটি আপনার জন্য ওয়েবকনফিগ ফাইল থেকে জাদুকরীভাবে তৈরি হয় না, তাই আপনাকে নিজের রোল করতে হবে।
এমএসডিএন-এর নমুনা কোডটি ধরে নিয়েছে যে আপনি কোনও ওয়েব সাইট প্রকল্প ব্যবহার করছেন, এবং তারা আপনাকে সম্পত্তি সহ <profile>
আপনার Web.config
এবং পার্টিতে কোনও বিভাগ যুক্ত করতে বলে , তবে এটি ওয়েব অ্যাপ্লিকেশন প্রকল্পগুলিতে কাজ করে না।Profile.
আপনার নিজস্ব রোল করার জন্য আপনার দুটি পছন্দ আছে:
(1) ওয়েব প্রোফাইল বিল্ডার ব্যবহার করুন । এটি ভিজ্যুয়াল স্টুডিওতে আপনি যুক্ত একটি কাস্টম সরঞ্জাম যা ওয়েবকনফাইগের আপনার সংজ্ঞা থেকে আপনার প্রয়োজনীয় প্রোফাইল অবজেক্টটি স্বয়ংক্রিয়ভাবে উত্পন্ন করে।
আমি এটি না করা বেছে নিয়েছি, কারণ আমি চাইছি না যে আমার কোডটি এই অতিরিক্ত সরঞ্জামটি সংকলিত করার জন্য নির্ভর করবে, যা তারা এই সরঞ্জামটির প্রয়োজন অনুধাবন করেই আমার কোডটি তৈরি করার চেষ্টা করার সময় লাইনের নীচে অন্য কারও জন্য সমস্যা সৃষ্টি করতে পারে।
(২) আপনার নিজস্ব ProfileBase
কাস্টম প্রোফাইল উপস্থাপন থেকে প্রাপ্ত এমন একটি নিজস্ব শ্রেণি তৈরি করুন । এটি এটি মনে হয় চেয়ে সহজ। এখানে একটি খুব সাধারণ উদাহরণ যা একটি "সম্পূর্ণ নাম" স্ট্রিং প্রোফাইল ক্ষেত্র যুক্ত করে:
আপনার ওয়েব.কমফিগ:
<profile defaultProvider="SqlProvider" inherits="YourNamespace.AccountProfile">
<providers>
<clear />
<add name="SqlProvider"
type="System.Web.Profile.SqlProfileProvider"
connectionStringName="sqlServerMembership" />
</providers>
</profile>
অ্যাকাউন্টপ্রোফিল.সি.এস নামে একটি ফাইলে:
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="..">
কনফিগের পাশাপাশি সেইসাথে অ্যাকাউন্টপ্রোফাইল শ্রেণিতে প্রোফাইল বৈশিষ্ট্যগুলি সংজ্ঞায়িত করেন তবে আপনি ওয়েবকনফাইগের বৈশিষ্ট্যগুলি সরিয়ে সহজেই ঠিক করা "এই সম্পত্তিটি ইতিমধ্যে সংজ্ঞায়িত করা হয়েছে" পেয়ে যাবেন।
ওয়েব অ্যাপ্লিকেশন প্রকল্পগুলি তখনও প্রোফাইলকমন অবজেক্টটি কেবলমাত্র রানটাইম ব্যবহার করতে পারে। এর কোডটি কেবলমাত্র প্রকল্পে তৈরি করা হয়নি তবে ক্লাসটি এএসপি.নেট তৈরি করেছে এবং রানটাইমটিতে উপস্থিত রয়েছে is
অবজেক্টে যাওয়ার সহজ উপায় হ'ল নীচে প্রদর্শিত হিসাবে ডায়নামিক টাইপ ব্যবহার করা।
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();
গতিশীল ধরণগুলি ব্যবহার করে আপনি স্বাচ্ছন্দ্য বোধ করেন এবং সংকলন-সময় চেকিং এবং ইন্টেলিসেন্সের অভাবকে ঘৃণা করেন না তবে উপরেরটি সূক্ষ্মভাবে কাজ করে।
আপনি যদি এএসপি. নেট নেট এমভিসির সাথে এটি ব্যবহার করেন তবে আপনাকে কিছু অতিরিক্ত কাজ করতে হবে যদি আপনি নিজের মতামতগুলিতে গতিশীল প্রোফাইল অবজেক্টটি পাস করেন যেহেতু এইচটিএমএল সহায়ক পদ্ধতিগুলি গতিশীল "মডেল" অবজেক্টগুলির সাথে ভাল খেলেন না। এইচটিএমএল সহায়ক সহায়ক পদ্ধতিতে প্রেরণের আগে আপনাকে প্রোফাইল বৈশিষ্ট্য স্থিতিযুক্ত টাইপযুক্ত ভেরিয়েবলগুলিতে নির্ধারণ করতে হবে।
// 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
উপরে যদি বর্ণিত জোয়েল যেমন আপনি একটি কাস্টম প্রোফাইল শ্রেণি তৈরি করেন তবে এএসপি.নেট এখনও প্রোফাইলকমনের ক্লাস তৈরি করবে তবে এটি আপনার কাস্টম প্রোফাইল শ্রেণীর উত্তরাধিকার সূত্রে প্রাপ্ত হবে। যদি আপনি কোনও কাস্টম প্রোফাইল শ্রেণি নির্দিষ্ট না করেন তবে প্রোফাইলকমন System.Web.Profile.ProfileBase থেকে উত্তরাধিকারী হবে।
আপনি যদি নিজের প্রোফাইল ক্লাস তৈরি করেন তবে নিশ্চিত হয়ে নিন যে আপনি ইতিমধ্যে নিজের কাস্টম প্রোফাইল শ্রেণিতে ঘোষণা করেছেন এমন ওয়েবকনফিগ ফাইলে প্রোফাইল বৈশিষ্ট্য নির্দিষ্ট করা হয়নি। আপনি যদি এএসপি করেন N নেট প্রোফাইল প্রোফাইল ক্লাস উত্পন্ন করার চেষ্টা করার সময় একটি সংকলক ত্রুটি দেয়।
প্রোফাইল ওয়েব অ্যাপ্লিকেশন প্রকল্পগুলিতেও ব্যবহার করা যেতে পারে। বৈশিষ্ট্যগুলি ডিজাইন সময় বা প্রোগ্রামমেটিকভাবে ওয়েবকনফিগে সংজ্ঞায়িত করা যায়। ওয়েবকনফিগে:
<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>
বা প্রোগ্রামেটিক্যালি, একটি শুরু করতে গিয়ে দ্বারা প্রফাইল অধ্যায় তৈরি ProfileSection এবং ব্যবহার পৃথক বৈশিষ্ট্য তৈরি ProfilePropertySettings এবং ProfilePropertySettingsColletion , যার মধ্যে সব System.Web.Configuration নামস্থান রয়েছে। প্রোফাইলের সেই বৈশিষ্ট্যগুলি ব্যবহার করতে, System.Web.Profile.ProfileBase অবজেক্ট ব্যবহার করুন। প্রোফাইল বৈশিষ্ট্যগুলি প্রোফাইল দিয়ে অ্যাক্সেস করা যায় না । সিনট্যাক্স উপরের হিসাবে উল্লেখ করা হয়েছে, কিন্তু সহজে একটি ProfileBase শুরু করতে গিয়ে এবং ব্যবহার করে কাজ করা যেতে পারে 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")
?
আপনি যখন ভিজ্যুয়াল স্টুডিওতে একটি নতুন ওয়েব সাইট প্রকল্প তৈরি করবেন তখন প্রোফাইল থেকে প্রত্যাবর্তিত অবজেক্টটি আপনার জন্য (স্বয়ংক্রিয়ভাবে) উত্পন্ন হবে। আপনি যখন কোনও ওয়েব অ্যাপ্লিকেশন প্রকল্প বা এমভিসি প্রকল্প তৈরি করেন, আপনাকে নিজের রোল করতে হবে।
এটি সম্ভবত এটির চেয়ে আরও কঠিন বলে মনে হচ্ছে। আপনাকে নিম্নলিখিতগুলি করতে হবে:
আপনি যদি কোনও ওয়েব অ্যাপ্লিকেশন প্রকল্প ব্যবহার করেন তবে আপনি বাক্সের বাইরে নকশাকালীন প্রোফাইল অবজেক্টে অ্যাক্সেস করতে পারবেন না। এখানে একটি ইউটিলিটি কল্পনানুসারে আপনার জন্য এটা আছে যে: http://weblogs.asp.net/joewrobel/archive/2008/02/03/web-profile-builder-for-web-application-projects.aspx । ব্যক্তিগতভাবে, সেই ইউটিলিটিটি আমার প্রকল্পে একটি ত্রুটি সৃষ্টি করেছিল তাই আমি প্রোফাইলবেস থেকে উত্তরাধিকারী হওয়ার জন্য আমার নিজের প্রোফাইল ক্লাসটি ঘুরিয়ে শেষ করেছি। এটি করা মোটেই কঠিন ছিল না।
একটি কাস্টম ক্লাস তৈরি করার জন্য এমএসডিএন ওয়াকথ্রু (ওরফে জোলের পদ্ধতি):
http://msdn.microsoft.com/en-us/magazine/cc163624.aspx
আমিও একই ইস্যু নিয়ে চলছিলাম। তবে প্রোফাইলবেস থেকে উত্তরাধিকার সূত্রে এমন একটি শ্রেণী তৈরি করার পরিবর্তে আমি এইচটিটিপি কনটেক্সট ব্যবহার করেছি।
ওয়েবকনফিগ ফাইলে নিম্নরূপ বৈশিষ্ট্য উল্লেখ করুন:
এখন, নিম্নলিখিত কোডটি লিখুন:
কোডটি কম্পাইল করে চালান run আপনি নিম্নলিখিত আউটপুট পাবেন: -
ওয়েব প্রোফাইল নির্মাতা আমার জন্য কাজ করে মহান। এটি তৈরি করা শ্রেণীর জোলে পোস্টের বর্ণনা অনুসারে এর মধ্যে আরও অনেক কিছু রয়েছে। এর প্রকৃত প্রয়োজন বা দরকারী আমি তা জানি না।
যাইহোক, ক্লাস উত্পন্ন করার একটি সহজ উপায় খুঁজছেন তাদের জন্য, তবে আপনি সর্বদা পারেন এমন কোনও বাহ্যিক বিল্ড সরঞ্জাম নির্ভরতা পেতে চান না
বা (স্বাক্ষরিত তবে কেবল কাজ করতে পারে)
যদি এই দ্বিতীয় পদ্ধতির কাজ করে তবে কেউ আমাকে ভবিষ্যতের রেফারেন্সের জন্য জানাতে পারে
জোয়েল স্পলস্কির উত্তরে কেবল যুক্ত করতে চাই
আমি তার সমাধানটি কার্যকর করেছি, বিটিডব্লিউ-তে দুর্দান্তভাবে কাজ করছি!
যে ব্যবহারকারী এমন ব্যবহারকারীর প্রোফাইল পেতে চাইছেন যা আমি লগ ইন করা ব্যবহারকারী হিসাবে ব্যবহার করি নি:
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(); }
}
}
}
একটি যাদুমন্ত্র মত কাজ করে...
দুর্দান্ত পোস্ট,
কেবলমাত্র ওয়েবকনফাইগের একটি নোট যদি আপনি প্রোফাইল উপাদানটিতে উত্তরাধিকারের বৈশিষ্ট্যটি নির্দিষ্ট না করেন তবে আপনাকে নীচের মত ওয়েবকনফাইগের প্রোফাইলে উপাদানটির ভিতরে প্রতিটি স্বতন্ত্র প্রোফাইল বৈশিষ্ট্য নির্দিষ্ট করতে হবে
<properties>
<clear/>
<add name="property-name-1" />
<add name="property-name-2" />
..........
</properties>