Profiles are not auto generated with Web Applications, so you can’t just add them in the web.config and use them directly. (unless …)
The WebSite project do a magic thing : when you add properties to the profile in the web.config file, a class is autogenerated and allow the developer to access these properties. The web application project don’t do that.
You can find some workarounds over the web, here is some
- http://weblogs.asp.net/joewrobel/archive/2008/02/03/web-profile-builder-for-web-application-projects.aspx
- http://leedumond.com/blog/asp-net-profiles-in-web-application-projects/
- http://willmtz.blogspot.com/2011/09/using-aspnet-profile-feature-in-web.html
- http://stackoverflow.com/questions/426609/how-to-assign-profile-values
The “dynamic” keyword help us here.
So, no more chit chat, here is the code snippets for a profile with 3 parameters : LastName, FirstName and GSM
web.config:
<profile enabled="true"> <providers> <clear/> <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="MyApp"/> </providers> <properties> <add name="FirstName" type="string"/> <add name="LastName" type="string"/> <add name="GSM" type="string"/> </properties> </profile>
A “business” class, I called it “ProfilePresenter”, it returns the profile of the logged user and allow modifications:
public class ProfilePresenter
{
public dynamic GetProfile()
{
return HttpContext.Current.Profile;
}
public dynamic UpdateProfile(string FirstName, string LastName, string GSM)
{
HttpContext.Current.Profile.SetPropertyValue("FirstName", FirstName);
HttpContext.Current.Profile.SetPropertyValue("LastName", LastName);
HttpContext.Current.Profile.SetPropertyValue("GSM", GSM);
HttpContext.Current.Profile.Save();
return HttpContext.Current.Profile;
}
}
A page that uses the ProfilePresenter class : displaying the profile properties, and edit them
ObjectDataSource:
<asp:ObjectDataSource runat="server" ID="ProfileODS" TypeName="Board.Presenters.ProfilePresenter" SelectMethod="GetProfile" UpdateMethod="UpdateProfile"/> <pre>
FormView: Display part
<asp:FormView runat="server" ID="ProfileFV" DataSourceID="ProfileODS" RenderOuterTable="false">
<EmptyDataTemplate>
<p>
No profil datas
</p>
</EmptyDataTemplate>
<ItemTemplate>
<h2>
Profil informations</h2>
<div>
<asp:Button runat="server" ID="Edit" CommandName="Edit" Text="Edit" /></div>
<table>
<thead>
<tr>
<th colspan="2">
Infos
</th>
</tr>
</thead>
<tbody>
<tr>
<th>
LastName
</th>
<td>
<%# Eval("LastName")%>
</td>
</tr>
<tr>
<th>
FirstName
</th>
<td>
<%# Eval("FirstName")%>
</td>
</tr>
<tr>
<th>
GSM
</th>
<td>
<%# Eval("GSM")%>
</td>
</tr>
</tbody>
</table>
</ItemTemplate>
FormView : the Edit part
<EditItemTemplate>
<h2>
Profil Update</h2>
<div>
<asp:Button runat="server" ID="Edit" CommandName="Cancel" Text="Annuler" />
<asp:Button runat="server" ID="Button1" CommandName="Update" Text="Sauver" /></div>
<table>
<thead>
<tr>
<th colspan="2">
Infos
</th>
</tr>
</thead>
<tbody>
<tr>
<th>
LastName
</th>
<td>
<asp:TextBox runat="server" ID="LastName" Text='<%# Bind("LastName")%>' />
</td>
</tr>
<tr>
<th>
FirstName
</th>
<td>
<asp:TextBox runat="server" ID="FirstName" Text='<%# Bind("FirstName")%>' />
</td>
</tr>
<tr>
<th>
GSM
</th>
<td>
<asp:TextBox runat="server" ID="GSM" Text='<%# Bind("GSM")%>' />
</td>
</tr>
</tbody>
</table>
</EditItemTemplate>
</asp:FormView>
A simple use :
dynamic profil = HttpContext.Current.Profile;
if (profil != null)
{
Console.Writeline(profil.GSM);
}
Another example : retrieve the gsm numbers from members of a security role. It shows how to retrieve the profile of an other user
string[] users = Roles.GetUsersInRole(role);
List<string> gsm = new List<string>();
foreach (string user in users)
{
dynamic profil = HttpContext.Current.Profile;
dynamic profi = profil.GetProfile(user);
if (profi != null)
{
if (!string.IsNullOrEmpty(profi.GSM))
{
gsm.Add(profi.GSM);
}
}
}
Let me know what you think !
















