Profil değerleri nasıl atanır?


110

Neyi kaçırdığımı bilmiyorum, ancak Web.config dosyasına Profil özelliklerini ekledim ancak Profil'e erişemiyorum. Koddaki öğe veya yeni bir profil oluşturun.

Yanıtlar:


179

Bugün aynı sorunu yaşadım ve çok şey öğrendim.

Visual Studio'da iki tür proje vardır - "Web Sitesi Projeleri" ve "Web Uygulama Projeleri". Benim için tam bir muamma olan nedenlerden dolayı, Web Uygulama Projeleri Profili kullanamaz . doğrudan ... türü kesin belirlenmiş sınıf, sizin için Web.config dosyasından sihirli bir şekilde oluşturulmaz, bu nedenle kendi sınıfınızı oluşturmanız gerekir.

MSDN'deki örnek kod, bir Web Sitesi Projesi kullandığınızı varsayar ve size yalnızca mülkle birlikte tarafınıza bir <profile>bölüm eklemenizi söyler , ancak bu Web Uygulama Projelerinde çalışmaz.Web.configProfile.

Kendiniz yapmak için iki seçeneğiniz var:

(1) Web Profile Builder'ı kullanın . Bu, Visual Studio'ya eklediğiniz ve Web.config dosyasındaki tanımınızdan ihtiyacınız olan Profile nesnesini otomatik olarak oluşturan özel bir araçtır.

Bunu yapmamayı seçtim, çünkü kodumun derlemek için bu ekstra araca bağlı olmasını istemiyordum, bu da bu araca ihtiyaç duyduklarının farkında olmadan kodumu oluşturmaya çalışan başka biri için sorunlara neden olabilirdi.

(2) ProfileBaseÖzel profilinizi temsil etmek için türetilen kendi sınıfınızı oluşturun . Bu göründüğünden daha kolay. Burada, "Tam Ad" dizesi profil alanı ekleyen çok basit bir örnek verilmiştir:

Web.config dosyanızda:

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

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

</profile>

AccountProfile.cs adlı bir dosyada:

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

Bir profil değeri ayarlamak için:

AccountProfile.CurrentUser.FullName = "Snoopy";

Profil değeri almak için

string x = AccountProfile.CurrentUser.FullName;

10
StackOverflow'un kendisi profilleri kullanmaz. Bu kod, muhtemelen günde 1.000.000 sayfa görüntülenen bir site için yeterince hızlı değildir. Bunu yazarken başka bir proje üzerinde çalışıyordum.
Joel Spolsky

1
Bu benim hatam, ancak CurrentUser'ı aradıktan sonra özellikleri ayarlama konusunda bir süre uğraştım. CurrentUser her seferinde yeni bir örnek oluşturup döndürdüğünden, bunun yerine bir yöntem olarak tanımlanmasını önerebilir miyim? Düşünmeden şunu yazdım: AccountProfile.CurrentUser.FullName = "Snoopy"; AccountProfile.CurrentUser.OtherProperty = "ABC"; AccountProfile.CurrentUser.Save (); hangi çalışmıyor. Şöyle olmalıdır: AccountProfile currentProfile = AccountProfile.CurrentUser; currentProfile.FullName = "Snoopy"; currentProfile.OtherProperty = "ABC"; ) (currentProfile.Save;
Jeremy Gruenwald

1
Bu, Profil'in tüm amacını bozmaz mı? "Profile.MyProperty" i kullanamazsınız, her sayfada Profilin otomatik olduğu gibi ayarlanmayan kendi evde yetiştirilen sınıfınızı kullanmanız gerekir. Bütün bunlar, Kaydet () özelliğini kodlamak zorunda kalmadan kullanmanıza izin vermektir.
Mike K

7
Web Uygulama Projeleri Profili kullanamaz.
Joel Spolsky

2
<profile ..><properties><add name="..">AccountProfile sınıfının yanı sıra web yapılandırmasında da yanlışlıkla profil özelliklerini tanımlarsanız , web.config dosyasındaki özellikleri kaldırarak kolayca düzeltilen bir "Bu özellik zaten tanımlanmıştır" mesajı alırsınız.
Zachary Scott

17

Web Uygulama Projeleri ProfileCommon nesnesini yine de kullanabilir, ancak yalnızca çalışma zamanında. Bunun kodu sadece projenin kendisinde oluşturulmaz, ancak sınıf ASP.Net tarafından oluşturulur ve çalışma zamanında mevcuttur.

Nesneye ulaşmanın en basit yolu, aşağıda gösterildiği gibi dinamik bir tür kullanmaktır.

Web.config dosyasında profil özelliklerini bildirin:

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

Ardından mülklere erişmek için:

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

Profil özelliklerindeki değişiklikleri kaydetmek için:

profile.Save();

Dinamik türleri kullanmakta rahatsanız ve derleme zamanı kontrolünün ve zekanın eksikliğine aldırış etmiyorsanız, yukarıdakiler iyi çalışır.

Bunu ASP.Net MVC ile kullanırsanız, dinamik profil nesnesini görünümlerinize iletirseniz, HTML yardımcı yöntemleri dinamik olan "model" nesnelerle iyi oynamadığı için bazı ek işler yapmanız gerekir. Statik olarak yazılmış değişkenleri HTML yardımcı yöntemlerine geçirmeden önce profil özelliklerini atamanız gerekir.

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

Joel'in yukarıda açıkladığı gibi özel bir profil sınıfı oluşturursanız, ASP.Net yine de ProfileCommon sınıfını oluşturacak ancak özel profil sınıfınızdan miras alacaktır. Özel bir profil sınıfı belirtmezseniz, ProfileCommon System.Web.Profile.ProfileBase'den devralır.

Kendi profil sınıfınızı oluşturursanız, özel profil sınıfınızda önceden bildirmiş olduğunuz Web.config dosyasında profil özelliklerini belirtmediğinizden emin olun. Bunu yaparsanız, ASP.Net ProfileCommon sınıfını oluşturmaya çalıştığında bir derleyici hatası verir.


profili kaydedemiyorum. hata şudur: 'ProfileCommon', 'kaydetme' için bir tanım içermiyor
Jimmy

2
@Salman: ProfileCommon, Save () yöntemine sahip System.Web.Profile.ProfileBase'den türetilmiştir. Lütfen büyük harf kullanımınızın doğru olup olmadığını kontrol edin. Bakınız: msdn.microsoft.com/en-us/library/…
colivier

13

Profil Web Uygulama Projelerinde de kullanılabilir. Özellikler, Web.config dosyasında tasarım zamanında veya programlı olarak tanımlanabilir. Web.config dosyasında:

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

veya programlı bir başlatmasını tarafından profil bölümü oluşturmak ProfileSection kullanılarak tek tek özellikleri oluşturmak ProfilePropertySettings ve ProfilePropertySettingsColletion System.Web.Configuration ad alanı içinde olan bir. Profilin bu özelliklerini kullanmak için System.Web.Profile.ProfileBase Nesnelerini kullanın. Profil özelliklerine profil ile erişilemez . sözdizimi yukarıda belirtildiği gibi, ancak aşağıdaki gibi bir ProfileBase'i başlatarak ve SetPropertyValue (" PropertyName ") ve GetPropertyValue {" PropertyName ") kullanarak kolayca yapılabilir :

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

veya mevcut kullanıcının profiline erişmek için:

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
Bunun neden 1000 oy almadığını bilmiyorum. Son derece faydalıdır.
pghcpa

Sanırım kimse aşağı kaydırmayı rahatsız etmiyor. Bu Altın, teşekkürler Bede! Yukarıdaki verileri kaydettikten sonra, kullanıcı verilerine herhangi bir yerden yalnızca yeni bir ProfileBasenesne oluşturarak ve GetPropertyValue("PropName")?
seebiscuit

Şaşırtıcı, benim için işe yarayan tek yol bu. Thans Bede
Emanuel Pirovano

İlk sorun, başka bir sayfaya girmeyi nasıl kullanabilirim?
Emanuel Pirovano

8

Visual Studio'da yeni bir Web sitesi projesi oluşturduğunuzda, Profile'dan döndürülen nesne sizin için (otomatik olarak) üretilecektir. Bir Web uygulaması projesi veya bir MVC projesi oluşturduğunuzda, kendi projenizi oluşturmanız gerekecektir.

Bu muhtemelen olduğundan daha zor geliyor. Aşağıdakileri yapmanız gerekir:

  • Aspnet_regsql.exe kullanarak bir veritabanı oluşturun Bu araç, .NET çerçevesi ile birlikte yüklenir.
  • ProfileGroupBase'den türetilen bir sınıf yazın veya Web.Config konsolundaki tanımdan sizin için sınıfı oluşturabilecek Web Profile Builder'ı (WPB) yükleyin. WPB'yi bir süredir kullanıyorum ve şimdiye kadar ondan bekleneni yaptı. Çok sayıda özelliğiniz varsa, WPB kullanmak oldukça zaman kazandırabilir.
  • Veritabanına bağlantının Web.Config konsolunda düzgün şekilde yapılandırıldığından emin olun.
  • Artık profil sınıfınızın bir örneğini oluşturmaya hazırsınız (denetleyicide)
  • Görünümlerinizde muhtemelen profil özelliği değerlerine ihtiyacınız olacak. Profil nesnesinin kendisini görünüme iletmeyi seviyorum (bireysel özelliklere değil).

3

Bir web uygulaması projesi kullanıyorsanız, kutudan çıkar çıkmaz tasarım zamanında Profil nesnesine erişemezsiniz. İşte bunu sizin için yaptığı varsayılan bir yardımcı program: http://weblogs.asp.net/joewrobel/archive/2008/02/03/web-profile-builder-for-web-application-projects.aspx . Şahsen, bu yardımcı program projemde bir hataya neden oldu, bu yüzden kendi profil sınıfımı ProfileBase'den devralmak için yuvarladım. Yapması hiç zor olmadı.


3
System.Web.Profile - İşte bazı örnek kod: weblogs.asp.net/jgalloway/archive/2008/01/19/…
nshaw


2

Ben de aynı sorunu yaşıyordum. Ancak ProfileBase'den miras alan bir sınıf oluşturmak yerine, HttpContext'i kullandım.

Web.config dosyasındaki özellikleri aşağıdaki gibi belirtin: - ProfilePropertyWeb.config

Şimdi aşağıdaki kodu yazın: -

Profil Özelliklerinin Arkasındaki Kod

Kodu derleyin ve çalıştırın. Aşağıdaki çıktıyı alacaksınız: -

Çıktı


1

Web Profili Oluşturucu benim için çok çalıştı. Oluşturduğu sınıf, Joel'in gönderisinde anlatılandan çok daha fazlasını içeriyor. Gerçekten gerekli ya da yararlı olup olmadığını bilmiyorum.

Her neyse, sınıfı oluşturmanın kolay bir yolunu arayanlar, ancak harici bir oluşturma aracı bağımlılığına sahip olmak istemeyenler için her zaman yapabilirsiniz

  • web profili oluşturucuyu kullanın
  • tüm izini sil!
  • oluşturulan Profil sınıfını kullanmaya devam edin

VEYA (test edilmemiştir ancak işe yarayabilir)

  • bir web sitesi projesi oluştur
  • elementini yarat
  • oluşturulan sınıfı yapıştırın ve web projesi projenize kopyalayın

Bu ikinci yaklaşım işe yararsa, birisi ileride başvurmak için bana haber verebilir mi?


1

Joel Spolsky'nin cevabına eklemek istiyorum

Onun çözümünü, mükemmel bir şekilde çalışarak uyguladım - Cudos!

Kullandığım oturum açmış kullanıcı olmayan bir kullanıcı profili almak isteyen herkes için:

web.config:

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

ve

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

Ve sonra özel sınıfım:

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(); }
        }
    }
}

Tıkır tıkır çalışıyor...


0

Harika gönderi,

Profil öğesinde miras özniteliğini belirtmezseniz, web.config dosyasında yalnızca bir not alın, aşağıdaki gibi web.config üzerindeki profil öğesi içindeki her bir bireysel profil özelliğini belirtmeniz gerekecektir

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

 </properties>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.