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