Sök på tekniken.nu

Om tekniken.nu

På tekniken.nu bloggar Iteams konsulter om det som ligger dem varmast om hjärtat - teknik.
www.iteam.se

Prenumerera på tekniken.nu

Bloggportalen.se
Bloggtoppen.se
Top Datorer bloggar
Web Analytics

Clicky

En självklarhet!
Teknikbloggen logotype

Så använder man ASP.NET Profile i Web Application Projects

2010-05-27 10:22 - Utvecklingstips av Johanna Gustafsson
Johanna Gustafsson
Johanna Gustafsson
Systemutvecklare
Iteam

I ett pågående projekt där vi implementerar en custom membership provider stötte jag på ett problem som först verkade helt irrationellt men som sedan visade sig vara fullt logiskt och försvarbart (som vanligt). Uppgiften vid tillfället var att skapa ett par egna properties för ASP.NET Profile, som adress och flagga för nyhetsbrev. Så jag satte upp detta efter konstens alla regler men upptäckte direkt att något inte stämde.  Min förvirring visade sig bero på olikheter i de två projekttyperna Web Application Project och Web Site i Visual Studio - mer specifikt att en Web Site gör en dynamisk kompilering medan ett Web Application Project inte gör det.

Om du jobbar med en Web Site så definieras egna egenskaper i profilen  i Web.config och Visual Studio skapar metoden GetProfile() i klassen Profile, vilken kommer att returnera ett ProfileCommon-objekt (nedärvt från ProfileBase) som innehåller alla dina nya properties. Det var detta jag försökte göra, men med ett Web Application Project!

Hur yttrade sig då mitt problem? Jo, Profile hade ingen GetProfile(). Detta kan också vara ett symptom på att du satt upp dina properties felaktigt för Web Site-lösningen ovan, men så var det inte i detta fallet.

En vanlig lösning i äldre versioner av Visual Studio (2005) verkar vara att leta upp ett plugin till Visual Studio som löser problemet åt dig. Men nog så enkelt, och dessutom snyggt och prydligt, är att skapa en proxyklass för dina properties och skippa hela definitionen i web.config. Dessutom har du i en egen klass möjligheten att lägga in annan logik för att hantera andra krav på din profil, vilket du saknar vid definition i web.config. Värt att nämna är att den här metoden fungerar utmärkt också om du har en Web Site men vill lägga logiken för Profile i ett separat klassbibliotek.

Din klass kan t ex se ut så här:

public class MyCustomProfile : ProfileBase
{
	public string Address
	{
		get
		{
			return (string)GetPropertyValue("Address");
		}
		set

		{

			SetPropertyValue("Address", value);

		}

	}

	public bool NewsletterSubscription
	{
		get
		{
			return (bool)GetPropertyValue("NewsletterSubscription");
		}
		set
		{
			SetPropertyValue("NewsletterSubscription", value);
		}
	}

	/// <summary>
	/// Gets the profile of the current user
	/// </summary>
	/// <returns></returns>
	public static MyCustomProfile GetProfile()
	{
		return (MyCustomProfile)HttpContext.Current.Profile;
	}

	/// <summary>
	/// Gets the profile of a specific user
	/// </summary>
	/// <param name="userName">User name of the profile to get</param>
	/// <returns></returns>
	public static MyCustomProfile GetProfile(string userName)
	{
		return (MyCustomProfile)Create(userName);
	}
}

Som du ser ovan har jag lagt till en property för Address som kommer att hålla adressinformation för profilen samt en NewsletterSubscription som är en enkel flagga för att hålla koll på om användaren vill ha nyhetsbrev eller inte. På samma vis hanterar du övrig information som din Profile ska hålla. Klassen har även två metoder:

  • GetProfile() – returnerar den nuvarande användarens profil. Det som sker är att den gör en cast på HttpContext.Current.Profile till en MyCustomProfile och returnerar den.
  • GetProfile(string userName) – returnerar en profil med ett specifikt användarnamn (userName). Den använder sig av basklassens (ProfileBase) metod Create() och castar resultatet (ProfileBase) till MyCustomProfile.

Din proxyklass lägger du sedan till i web.config för att profilhanteringen i ASP.NET ska hitta den.

<profile enabled="true" defaultProvider="SqlProfile" inherits="MyProject.MyCustomProfile" automaticSaveEnabled="true">
      <providers>
        <clear/>
        <add name="SqlProfile" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="EPiServerDB" applicationName="EPiServerSample"/>
      </providers>
</profile>

I MyCustomProfile har vi nu tillgång till våra custom properties samt den vanliga Profile-funktionaliteten såsom Save().

Länktips (på engelska):


... och du vet väl att Iteam just nu söker duktiga medarbetare? Läs mer på iteam.se

Andra bloggar om:
2010-06-20 17:02 av Mikael
Grymt tack!
2010-06-24 09:37 av Christian
Hej!

Bra blogg!

Kan tipsa om att när man väl satt upp en egen proxyklass enligt ovan så kan man lägga till extra dynamiska properties i web.config som då migreras ihop med de man har angett. Det betyder att man kan då få fördelen med att ha en egen statisk klass för mer avancerade egenskaperna och sedan definiera de enklare egenskaperna i web.config:


....





Så kan man skriva Profile.Company
2011-08-08 12:07 av Andreas
Tack! Mycket bra info!

Kommentera

Namn

Email

URL

Kommentar

Skriv vad som står i bilden till höger