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 !