Jawaban:
Saya memiliki masalah yang sama hari ini, dan belajar banyak.
Ada dua jenis proyek dalam Visual Studio - "Proyek Situs Web" dan "Proyek Aplikasi Web." Untuk alasan yang merupakan misteri bagi saya, Proyek Aplikasi Web tidak dapat menggunakan Profil. langsung ... kelas yang diketik dengan kuat tidak dibuat secara ajaib untuk Anda dari file Web.config, jadi Anda harus menggulung sendiri.
Kode sampel di MSDN mengasumsikan Anda menggunakan proyek situs web, dan mereka memberitahu Anda hanya untuk menambahkan <profile>
bagian ke Anda Web.config
dan pesta dengan Profile.
properti , tapi itu tidak bekerja di proyek aplikasi web.
Anda memiliki dua pilihan untuk memulai sendiri:
(1) Gunakan Pembuat Profil Web . Ini adalah alat kustom yang Anda tambahkan ke Visual Studio yang secara otomatis menghasilkan objek Profil yang Anda butuhkan dari definisi Anda di Web.config.
Saya memilih untuk tidak melakukan ini, karena saya tidak ingin kode saya bergantung pada alat tambahan ini untuk dikompilasi, yang dapat menyebabkan masalah bagi orang lain di masa mendatang ketika mereka mencoba membuat kode saya tanpa menyadari bahwa mereka membutuhkan alat ini.
(2) Buat kelas Anda sendiri yang berasal dari ProfileBase
untuk mewakili profil kustom Anda. Ini lebih mudah dari yang terlihat. Berikut adalah contoh yang sangat sederhana yang menambahkan bidang profil string "FullName":
Di web.config Anda:
<profile defaultProvider="SqlProvider" inherits="YourNamespace.AccountProfile">
<providers>
<clear />
<add name="SqlProvider"
type="System.Web.Profile.SqlProfileProvider"
connectionStringName="sqlServerMembership" />
</providers>
</profile>
Dalam file bernama 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
}
}
Untuk menyetel nilai profil:
AccountProfile.CurrentUser.FullName = "Snoopy";
Untuk mendapatkan nilai profil
string x = AccountProfile.CurrentUser.FullName;
<profile ..><properties><add name="..">
serta di kelas AccountProfile, Anda akan mendapatkan "Properti ini telah ditentukan", dengan mudah diperbaiki dengan menghapus properti di web.config.
Proyek Aplikasi Web masih dapat menggunakan objek ProfileCommon tetapi hanya saat runtime. Kode untuk itu tidak dibuat dalam proyek itu sendiri tetapi kelasnya dibuat oleh ASP.Net dan ada saat runtime.
Cara termudah untuk mencapai objek adalah dengan menggunakan tipe dinamis seperti yang ditunjukkan di bawah ini.
Di file Web.config, nyatakan properti profil:
<profile ...
<properties>
<add name="GivenName"/>
<add name="Surname"/>
</properties>
Kemudian untuk mengakses properti:
dynamic profile = ProfileBase.Create(Membership.GetUser().UserName);
string s = profile.GivenName;
profile.Surname = "Smith";
Untuk menyimpan perubahan pada properti profil:
profile.Save();
Di atas berfungsi dengan baik jika Anda merasa nyaman menggunakan tipe dinamis dan tidak keberatan dengan kurangnya pemeriksaan waktu kompilasi dan intellisense.
Jika Anda menggunakan ini dengan ASP.Net MVC, Anda harus melakukan beberapa pekerjaan tambahan jika Anda meneruskan objek profil dinamis ke tampilan Anda karena metode pembantu HTML tidak bekerja dengan baik dengan objek "model" yang dinamis. Anda harus menetapkan properti profil ke variabel yang diketik secara statis sebelum meneruskannya ke metode helper 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
Jika Anda membuat kelas profil khusus, seperti yang dijelaskan Joel di atas, ASP.Net masih akan menghasilkan kelas ProfileCommon tetapi akan mewarisi dari kelas profil khusus Anda. Jika Anda tidak menentukan kelas profil khusus, ProfileCommon akan mewarisi dari System.Web.Profile.ProfileBase.
Jika Anda membuat kelas profil Anda sendiri, pastikan Anda tidak menentukan properti profil di file Web.config yang telah Anda nyatakan di kelas profil khusus Anda. Jika Anda melakukan ASP.Net akan memberikan kesalahan kompiler ketika mencoba untuk menghasilkan kelas ProfileCommon.
Profil juga dapat digunakan dalam Proyek Aplikasi Web. Properti dapat didefinisikan di Web.config pada waktu desain atau secara terprogram. Di 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>
atau Secara terprogram, buat bagian profil dengan membuat instance ProfileSection dan membuat properti individual menggunakan ProfilePropertySettings dan ProfilePropertySettingsColletion , yang semuanya ada di System.Web.Configuration Namespace. Untuk menggunakan properti profil tersebut, gunakan System.Web.Profile.ProfileBase Objects. Properti profil tidak dapat diakses dengan profil. sintaks seperti yang disebutkan di atas, tetapi dapat dengan mudah dilakukan dengan membuat instance ProfileBase dan menggunakan SetPropertyValue (" PropertyName ") dan GetPropertyValue {" PropertyName ") sebagai berikut:
ProfileBase curProfile = ProfileBase.Create("MyName");
atau untuk mengakses profil pengguna saat ini:
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
objek baru dan memanggil GetPropertyValue("PropName")
?
Ketika Anda membuat proyek situs Web baru di Visual Studio maka objek yang dikembalikan dari profil akan (secara otomatis) dibuat untuk Anda. Saat Anda membuat proyek aplikasi Web atau proyek MVC, Anda harus membuat proyek Anda sendiri.
Ini mungkin terdengar lebih sulit daripada yang sebenarnya. Anda perlu melakukan hal berikut:
Jika Anda menggunakan proyek aplikasi web, Anda tidak dapat mengakses objek Profil pada waktu desain out-of-the-box. Berikut adalah utilitas yang seharusnya melakukannya untuk Anda: http://weblogs.asp.net/joewrobel/archive/2008/02/03/web-profile-builder-for-web-application-projects.aspx . Secara pribadi, utilitas itu menyebabkan kesalahan dalam proyek saya jadi saya akhirnya menggulirkan kelas profil saya sendiri untuk mewarisi dari ProfileBase. Tidak sulit sama sekali.
Panduan MSDN untuk membuat kelas kustom (alias metode Joel):
http://msdn.microsoft.com/en-us/magazine/cc163624.aspx
Saya juga mengalami masalah yang sama. Tetapi alih-alih membuat kelas yang mewarisi dari ProfileBase, saya menggunakan HttpContext.
Tentukan properti dalam file web.config sebagai berikut: -
Sekarang, tulis kode berikut: -
Kompilasi dan jalankan kodenya. Anda akan mendapatkan hasil sebagai berikut: -
The Web Profil Builder bekerja besar bagi saya. Kelas yang dihasilkannya memiliki lebih banyak daripada yang dijelaskan oleh posting Joel. Apakah ini benar-benar dibutuhkan atau berguna, saya tidak tahu.
Bagaimanapun, bagi mereka yang mencari cara mudah untuk membuat kelas, tetapi tidak ingin memiliki ketergantungan alat build eksternal, Anda selalu bisa
ATAU (belum teruji tetapi mungkin hanya berfungsi)
jika pendekatan kedua ini berhasil, bisakah seseorang memberi tahu saya untuk referensi di masa mendatang
Hanya ingin menambah jawaban Joel Spolsky
Saya menerapkan solusinya, bekerja dengan cemerlang btw - Cudos!
Untuk siapa pun yang ingin mendapatkan profil pengguna yang bukan pengguna yang masuk yang saya gunakan:
web.config:
<connectionStrings>
<clear />
<add name="LocalSqlConnection" connectionString="Data Source=***;Database=***;User Id=***;Password=***;Initial Catalog=***;Integrated Security=false" providerName="System.Data.SqlClient" />
</connectionStrings>
dan
<profile defaultProvider="SqlProvider" inherits="NameSpace.AccountProfile" enabled="true">
<providers>
<clear/>
<add name="SqlProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="LocalSqlConnection"/>
</providers>
Dan kemudian kelas khusus saya:
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(); }
}
}
}
Bekerja seperti pesona ...
Pos bagus,
Hanya catatan di web.config jika Anda tidak menentukan atribut pewarisan dalam elemen profil, Anda perlu menentukan setiap properti profil indiviudal di dalam elemen profil di web.config seperti di bawah ini
<properties>
<clear/>
<add name="property-name-1" />
<add name="property-name-2" />
..........
</properties>