Bagaimana cara menetapkan nilai Profil?

110

Saya tidak tahu apa yang saya lewatkan, tetapi saya menambahkan properti Profil di file Web.config tetapi tidak dapat mengakses Profil. Item dalam kode atau buat profil baru.

zsharp
sumber

Jawaban:

179

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.configdan 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 ProfileBaseuntuk 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;
Joel Spolsky
sumber
10
StackOverflow sendiri tidak menggunakan profil. Kode ini mungkin tidak cukup cepat untuk situs dengan 1.000.000 tampilan halaman sehari. Saya sedang mengerjakan proyek lain ketika saya menulis ini.
Joel Spolsky
1
Ini salah saya sendiri, tapi saya berjuang cukup lama dengan menyetel properti setelah memanggil CurrentUser. Sejak CurrentUser membuat instance dan mengembalikan instance baru setiap kali, dapatkah saya menyarankan untuk mendefinisikannya sebagai metode? Tanpa pikir panjang, saya menulis ini: AccountProfile.CurrentUser.FullName = "Snoopy"; AccountProfile.CurrentUser.OtherProperty = "ABC"; AccountProfile.CurrentUser.Save (); yang tidak berhasil. Seharusnya: AccountProfile currentProfile = AccountProfile.CurrentUser; currentProfile.FullName = "Snoopy"; currentProfile.OtherProperty = "ABC"; currentProfile.Save ();
Jeremy Gruenwald
1
Bukankah ini jenis mengalahkan seluruh tujuan Profil? Anda tidak dapat menggunakan "Profile.MyProperty", Anda harus menggunakan kelas buatan Anda sendiri, yang tidak diatur di setiap halaman seperti Profil secara otomatis. Semua ini memungkinkan Anda memanfaatkan fitur Save () tanpa harus mengkodekannya.
Mike K
7
Proyek Aplikasi Web tidak dapat menggunakan Profil.
Joel Spolsky
2
Jika Anda tidak sengaja menentukan properti profil di konfigurasi web di bawah <profile ..><properties><add name="..">serta di kelas AccountProfile, Anda akan mendapatkan "Properti ini telah ditentukan", dengan mudah diperbaiki dengan menghapus properti di web.config.
Zachary Scott
17

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.

colivier
sumber
saya tidak dapat menyimpan profil. kesalahannya adalah: 'ProfileCommon' tidak berisi definisi untuk 'simpan'
Jimmy
2
@Salman: ProfileCommon berasal dari System.Web.Profile.ProfileBase yang memiliki metode Save (). Harap periksa apakah kapitalisasi Anda sudah benar. Lihat: msdn.microsoft.com/en-us/library/…
colivier
13

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();
Bede Amarasekara
sumber
1
Saya tidak tahu mengapa ini tidak mendapatkan 1000 suara. Ini sangat membantu.
pghcpa
Saya kira tidak ada yang mau menggulir ke bawah sini. Ini Emas, terima kasih Bede! Setelah menyimpan data di atas, saya dapat mengakses data pengguna dari mana saja hanya dengan membuat ProfileBaseobjek baru dan memanggil GetPropertyValue("PropName")?
seebiscuit
Luar biasa, ini satu-satunya cara yang berhasil untuk saya. Thans Bede
Emanuel Pirovano
Masalah pertama, bagaimana saya bisa menggunakan get di halaman lain?
Emanuel Pirovano
8

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:

  • Buat database menggunakan aspnet_regsql.exe Alat ini diinstal bersama dengan framework .NET.
  • Tulis kelas yang berasal dari ProfileGroupBase atau instal Pembuat Profil Web (WPB) yang dapat menghasilkan kelas untuk Anda dari definisi di Web.Config. Saya telah menggunakan WPB untuk sementara waktu dan sampai sekarang telah melakukan apa yang diharapkan darinya. Jika Anda memiliki banyak properti, menggunakan WPB dapat menghemat banyak waktu.
  • Pastikan koneksi ke database dikonfigurasi dengan benar di Web.Config.
  • Sekarang Anda siap untuk membuat instance kelas profil Anda (di pengontrol)
  • Anda mungkin memerlukan nilai properti profil dalam tampilan Anda. Saya suka meneruskan objek profil itu sendiri ke tampilan (bukan properti individu).
Kapten Masuk Akal
sumber
3

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.

nshaw
sumber
3
System.Web.Profile - Berikut adalah beberapa contoh kode: weblogs.asp.net/jgalloway/archive/2008/01/19/…
nshaw
2

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: - ProfilePropertyWeb.config

Sekarang, tulis kode berikut: -

Kode Dibalik Properti Profil

Kompilasi dan jalankan kodenya. Anda akan mendapatkan hasil sebagai berikut: -

Keluaran

Anil Purswani
sumber
1

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

  • gunakan pembuat profil web
  • hapus semua jejaknya!
  • tetap menggunakan kelas Profil yang dibuat

ATAU (belum teruji tetapi mungkin hanya berfungsi)

  • membuat proyek situs web
  • buat elemen Anda
  • snap kelas yang dihasilkan dan salin ke proyek proyek web Anda

jika pendekatan kedua ini berhasil, bisakah seseorang memberi tahu saya untuk referensi di masa mendatang

Simon_Weaver
sumber
1

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 ...

Tendang bokong
sumber
0

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>
indy
sumber