Yanıtlar:
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.config
Profile.
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;
<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.
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.
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();
ProfileBase
nesne oluşturarak ve GetPropertyValue("PropName")
?
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:
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ı.
Özel bir sınıf (diğer adıyla Joel'in yöntemi) oluşturmak için MSDN açıklayıcı yolu:
http://msdn.microsoft.com/en-us/magazine/cc163624.aspx
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: -
Şimdi aşağıdaki kodu yazın: -
Kodu derleyin ve çalıştırın. Aşağıdaki çıktıyı alacaksınız: -
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
VEYA (test edilmemiştir ancak işe yarayabilir)
Bu ikinci yaklaşım işe yararsa, birisi ileride başvurmak için bana haber verebilir mi?
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...
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>