5

I'm trying to convert an existing website to a Web Application Project and I'm having big problems getting the profiles to work.

An example of codebehind in website project is

register-with-role-and-profile.ascx.cs

    // Add the newly created user to the default Role.
    Roles.AddUserToRole(CreateUserWizard1.UserName, wsatDefaultRole);

    // Create an empty Profile for the newly created user
    ProfileCommon p = (ProfileCommon)ProfileCommon.Create(CreateUserWizard1.UserName, true);

    // Populate some Profile properties. Values are located in web.config file
    p.Company.Company = ((TextBox)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("txbOfficeName")).Text;
    p.Company.Address = ((TextBox)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("txbOfficeAddress")).Text;
    p.Company.City = ((TextBox)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("txbOfficeCity")).Text;
    p.Company.State = ((DropDownList)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("ddlStates")).SelectedValue;
    p.Company.PostalCode = ((TextBox)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("txbOfficeZip")).Text;
    p.Company.Phone = ((TextBox)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("txbContactPhone")).Text;
    p.Company.Fax = ((TextBox)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("txbContactFax")).Text;
    p.Preferences.Newsletter = ((DropDownList)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("ddlNewsletter")).SelectedValue;

    // Save profile - must be done since we explicitly created it
    p.Save();

web.config

<profile defaultProvider="MyCMSTableProfileProvider" automaticSaveEnabled="false" enabled="true">
    <providers>
        <clear/>
        <add name="MyCMSTableProfileProvider" applicationName="MyCMS" connectionStringName="dbMyCMSConnectionString" table="aspnet_CustomProfile" type="CustomProfile.SqlTableProfileProvider"/>
        <add name="MyCMSStoredProcedureProfileProvider" applicationName="MyCMS" connectionStringName="dbMyCMSConnectionString" type="CustomProfile.SqlStoredProcedureProfileProvider" setProcedure="sp_wsat_SetCustomProfileData" readProcedure="sp_wsat_GetCustomProfileData"/>
    </providers>
    <properties>
        <group name="Personal">
            <add name="FirstName" type="String" defaultValue="[null]" customProviderData="FirstName;nvarchar"/>
            <add name="LastName" type="String" defaultValue="[null]" customProviderData="LastName;nvarchar"/>
            <add name="Gender" type="String" defaultValue="[null]" customProviderData="Gender;nvarchar"/>
            <add name="BirthDate" type="DateTime" defaultValue="[null]" customProviderData="BirthDate;datetime"/>
            <add name="Occupation" type="String" defaultValue="[null]" customProviderData="Occupation;nvarchar"/>
            <add name="Website" type="String" defaultValue="[null]" customProviderData="PersonalWebsite;nvarchar"/>
        </group>
        <group name="Address">
            <add name="Country" type="String" defaultValue="[null]" customProviderData="Country;nvarchar"/>
            <add name="Address" type="String" defaultValue="[null]" customProviderData="Address;nvarchar"/>
            <add name="AptNumber" type="String" defaultValue="[null]" customProviderData="AptNumber;nvarchar"/>
            <add name="City" type="String" defaultValue="[null]" customProviderData="City;nvarchar"/>
            <add name="State" type="String" defaultValue="[null]" customProviderData="State;nvarchar"/>
            <add name="PostalCode" type="String" defaultValue="[null]" customProviderData="PostalCode;nvarchar"/>
        </group>
        <group name="Contacts">
            <add name="DayPhone" type="String" defaultValue="[null]" customProviderData="DayPhone;nvarchar"/>
            <add name="DayPhoneExt" type="String" defaultValue="[null]" customProviderData="DayPhoneExt;nvarchar"/>
            <add name="EveningPhone" type="String" defaultValue="[null]" customProviderData="EveningPhone;nvarchar"/>
            <add name="EveningPhoneExt" type="String" defaultValue="[null]" customProviderData="EveningPhoneExt;nvarchar"/>
            <add name="CellPhone" type="String" defaultValue="[null]" customProviderData="CellPhone;nvarchar"/>
            <add name="Fax" type="String" defaultValue="[null]" customProviderData="Fax;nvarchar"/>
        </group>
        <group name="Company">
            <add name="Company" type="String" defaultValue="[null]" customProviderData="Company;nvarchar"/>
            <add name="Address" type="String" defaultValue="[null]" customProviderData="Address2;nvarchar"/>
            <add name="City" type="String" defaultValue="[null]" customProviderData="City2;nvarchar"/>
            <add name="State" type="String" defaultValue="[null]" customProviderData="State2;nvarchar"/>
            <add name="PostalCode" type="String" defaultValue="[null]" customProviderData="PostalCode2;nvarchar"/>
            <add name="Phone" type="String" defaultValue="[null]" customProviderData="Phone2;nvarchar"/>
            <add name="Fax" type="String" defaultValue="[null]" customProviderData="Fax2;nvarchar"/>
            <add name="Website" type="String" defaultValue="[null]" customProviderData="Website2;nvarchar"/>
        </group>
        <group name="Preferences">
            <add name="Culture" type="String" defaultValue="en-US" customProviderData="Culture;nvarchar"/>
            <add name="Newsletter" type="String" defaultValue="[null]" customProviderData="Newsletter;nvarchar"/>
        </group>
    </properties>
</profile>

but this gives error The type or namespace name 'ProfileCommon' could not be found (are you missing a using directive or an assembly reference?)

Using this example I created 2 new classes

ProfileInfo.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace myWSAT.controls
{
    [Serializable]
    public class Personal
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Gender { get; set; }
        public DateTime BirthDate { get; set; }
        public string Occupation { get; set; }
        public string Website { get; set; }
    }

    [Serializable]
    public class Address
    {
        public string Country { get; set; }
        public string Address1 { get; set; }
        public string AptNumber { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public string PostalCode { get; set; }
    }

    [Serializable]
    public class Contacts
    {
        public string DayPhone { get; set; }
        public string DayPhoneExt { get; set; }
        public string EveningPhone { get; set; }
        public string EveningPhoneExt { get; set; }
        public string CellPhone { get; set; }
        public string Fax { get; set; }

    }

    [Serializable]
    public class Company
    {
        public string CompanyName { get; set; }
        public string Address { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public string PostalCode { get; set; }
        public string Phone { get; set; }
        public string Fax { get; set; }
        public string Website { get; set; }

    }

    [Serializable]
    public class Preferences
    {
        public string Culture { get; set; }
        public string Newsletter { get; set; }

    }

    [Serializable]
    public class ProfileInfo
    {
        public Personal Personal { get; set; }
        public Address Address { get; set; }
        public Contacts Contacts { get; set; }
        public Company Company { get; set; }
        public Preferences Preferences { get; set; }
    }

}

wProfile.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Profile;

namespace myWSAT.controls
{
    public class wProfile : ProfileBase
    {
        public ProfileInfo ProfileInfo
        {
            get { return (ProfileInfo)GetPropertyValue("ProfileInfo"); }
        }

        public static wProfile GetProfile()
        {
            return (wProfile)HttpContext.Current.Profile;
        }

        public static wProfile GetProfile(string userName)
        {
            return (wProfile)Create(userName);
        }  
    }
}

and then amended register-with-role-and-profile.ascx.cs to

// add newly created user to default Role specified above
if (Roles.RoleExists(wsatDefaultRole))
{
    // Add the newly created user to the default Role.
    Roles.AddUserToRole(CreateUserWizard1.UserName, wsatDefaultRole);

    // Create an empty Profile for the newly created user
    wProfile p = wProfile.GetProfile(Membership.GetUser().UserName);
    //ProfileCommon p = (ProfileCommon)ProfileCommon.Create(CreateUserWizard1.UserName, true);

    // Populate some Profile properties. Values are located in web.config file
    p.ProfileInfo.Company.CompanyName = ((TextBox)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("txbOfficeName")).Text;
    p.ProfileInfo.Company.Address = ((TextBox)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("txbOfficeAddress")).Text;
    p.ProfileInfo.Company.City = ((TextBox)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("txbOfficeCity")).Text;
    p.ProfileInfo.Company.State = ((DropDownList)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("ddlStates")).SelectedValue;
    p.ProfileInfo.Company.PostalCode = ((TextBox)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("txbOfficeZip")).Text;
    p.ProfileInfo.Company.Phone = ((TextBox)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("txbContactPhone")).Text;
    p.ProfileInfo.Company.Fax = ((TextBox)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("txbContactFax")).Text;
    p.ProfileInfo.Preferences.Newsletter = ((DropDownList)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("ddlNewsletter")).SelectedValue;

    // Save profile - must be done since we explicitly created it
    p.Save();

}

This build and runs okay but the following line always returns null.

wProfile p = wProfile.GetProfile(Membership.GetUser().UserName);

I'm not sure what is wrong? I've also tried the example in the bottom of this link with no success

EDIT:

I have read lots of links and tried several of the solutions but my expertise is this area is not great. I guess I'm asking for a bit of help with syntax to get it running, I'll prob offer a bounty once I can.

EDIT: It may help if I attach the current state of my attempt at converting this to a WAP. http://www.mediafire.com/?ouabeoxwu75b52c

  • Have you checked the reference folder in the solution pane to see if there is any warning? Maybe yo need to get some dll from the source project (probably within bin folder) to fix the reference – Gonzix Aug 27 '13 at 21:11
  • All references are ok, Web Application Projects do not include the ProfileCommon class hence the reason I need to create a custom ProfileCommon class. –  Aug 27 '13 at 21:21
  • Maybe this is what you need? http://stackoverflow.com/questions/1584507/web-application-project-how-to-use-profilecommon – Gonzix Aug 27 '13 at 21:24
  • I have seen that link but am still struggling to get it working. How would I set a property that is grouped? Eg the link has `profile.SetPropertyValue("CompanyName", txbOfficeName.Text);` but I need `profile.Company.CompanyName = ...` –  Aug 27 '13 at 21:34
  • 1
    As seen in msdn, looks like you have to code your own wrapper... Total bullshit from my point of view! http://msdn.microsoft.com/en-us/library/aa983476.aspx – Gonzix Aug 27 '13 at 21:47
  • What is causing the null exception? Is it because Membership.GetUser() returns null? – Jakob Christensen Aug 30 '13 at 08:19
  • Membership.GetUser() does not return null, it returns the correct user who has logged in and passes it to wProfile.GetProfile. It's the wProfile class that always returns null. –  Aug 30 '13 at 09:22
  • Just out of curiosity, try to replace the first line in your web.config indicating the profile settings with the following one: `` – jwaliszko Sep 01 '13 at 15:11
  • Adding that line now gives an error on line `return (wProfile)HttpContext.Current.Profile;` in the wprofile.cs class. `System.Configuration.ConfigurationErrorsException was unhandled by user code Message=Attribute not recognized 'table'`. –  Sep 01 '13 at 18:01
  • So now *something* has happened which is not a silent null. Maybe this `inherits` attribute (http://msdn.microsoft.com/en-us/library/ms164644(v=vs.85).aspx) is a good trail. Now use this line (two additional attributes added just for the peace of mind): `` and try to debug through your provider if possible. I believe the error message talks about attribute `table="aspnet_CustomProfile"` from your provider declaration. – jwaliszko Sep 01 '13 at 19:19
  • Thanks, it looks like the current problems are based on an incorrect web.config. Does that now mean I need to create new methods to read/write to table `table="aspnet_CustomProfile"`? The website also contains `setProcedure="sp_wsat_SetCustomProfileData" readProcedure="sp_wsat_GetCustomProfileData"` in the web.config, are these the website procedures that are not available in a WAP? –  Sep 02 '13 at 09:09
  • It's hard to say for me, it should be done within the provider as I understand. Are you sure you need your own profile provider? Take a look here, where the default one is used in the simplest possible manner: http://stackoverflow.com/a/1111714/270315. On the other hand, if you need some customization (e.g. using additional tables etc.) you probably need your custom one. – jwaliszko Sep 02 '13 at 13:38
  • @JaroslawWaliszko -thanks for all your help. Essentially it was missing `inherits="myWSAT.controls.wProfile"` in the web.config. If you add that as an answer I'll accept. Once I've done some testing I'll also add a full update. –  Sep 03 '13 at 13:06
  • I'm really glad you were able to fix your issue after our conversation! – jwaliszko Sep 03 '13 at 18:39

4 Answers4

3

Your Membership.GetUser() returns null, this can be caused by:

  1. You are not authenticated, Membership.GetUser() will only work for an authenticated users. Otherwise, it's going to return null. To verify you're dealing with an authenticated request call User.Identity.IsAuthenticated on the page. If you've got an authenticated request, but Membership.GetUser() is still returning null, then that means the username associated with the authenticated user can't be found in the Membership datasource. Verify the username of the authenticated user with "User.Identity.Name".

  2. If you're calling one of the Membership.GetUser() overloads which takes the username and it's returning null, then that user doesn't exist in the Membership datasource (or we've got a bug). One way to easily verify this is to try a Membership.CreateUser() with the same username. If this doesn't throw an error because of a duplicate user, then you know the user never existed in the first place.

  3. Membership.GetUser() should have never worked for an anonymous user. No support was built into Membership for handling this case.

source: MSDN Forum

However if Membership.GetUser() returns null I whould change this line:

wProfile p = wProfile.GetProfile(Membership.GetUser().UserName);

to

if (Membership.GetUser() != null)
{
    wProfile p = wProfile.GetProfile(Membership.GetUser().UserName);
} else {
    // do whatever you want to do when the user is null, maybe some error or create the user
}
Peter
  • 27,590
  • 8
  • 64
  • 84
  • Membership.GetUser() method doesn't return null. This part is working fine. –  Aug 30 '13 at 23:32
  • If wProfile p = wProfile.GetProfile(Membership.GetUser().UserName); gives a nullpointer exception. Only Memberschip.GetUser() can be null. Or you should have a stacktrace with GetProfile in it. Add some logging to check it yourself. – Peter Aug 31 '13 at 08:13
  • I'm sorry but I'm positive it has nothing to do with `Membership.GetUser()`. I should have stated the method always returns null rather than gives error null exception. Also, the membership details are only available after a user has been created and logged in so Membership.GetUser() always returns the correctly logged in user. –  Sep 01 '13 at 14:49
  • You are a funny guy, if Membership.GetUser() returns a null then `Membership.GetUser().UserName` will give you a nullpointer exception. A null value does not have a username. – Peter Sep 02 '13 at 07:53
  • `wProfile p = wProfile.GetProfile....` returns null not `Membership.GetUser()`. I'm not trying to be funny just frustrated :) –  Sep 02 '13 at 08:33
3

One problem is that you are calling the Membership.GetUser() overload which will load user details for the currently logged on user. Since this seems to be part of a page where a user can register him/herself, that means that there is no currently logged on user when the code runs.

You should probably change the line to:

wProfile p = wProfile.GetProfile(Membership.GetUser(CreateUserWizard1.UserName).UserName);

That is assuming that you have already created the user at this point. Or simpler:

wProfile p = wProfile.GetProfile(CreateUserWizard1.UserName);

But I would suggest you also change the wProfile class so that the GetProfile(string userName) would load and return the profile for the user with user name userName. Then add an explicit CreateProfile(string userName) method that you can use when you want to create a profile. Creating a new profile as a side effect of a method called GetProfile is not, in my opinion, a good idea.

The code could then be:

wProfile p = wProfile.CreateProfile(CreateUserWizard1.UserName);
user1429080
  • 9,086
  • 4
  • 31
  • 54
1

I went through your solution and all of the comments. For me everything looks good despite one minor thing. I've noticed that your profile element in web.config doesn't use inherits attribute (http://msdn.microsoft.com/en-us/library/ms164644(v=vs.85).aspx). Try to add such an attribute with the value, which is a type reference for a custom type that derives from the ProfileBase abstract class - wProfile in your particular example, like below:

<profile defaultProvider="MyCMSTableProfileProvider" 
         automaticSaveEnabled="false" 
         enabled="true" 
         inherits="myWSAT.controls.wProfile">

Make respective changes to your custom provider if something will be broken after this change. What's more, I've found similar thread which you might be interested in: How to assign Profile values?

Community
  • 1
  • 1
jwaliszko
  • 16,942
  • 22
  • 92
  • 158
  • no problem, I was stuck on it for days and it was your suggestion that I was missing. I would rather give 500 points than £500 :). I've now converted the example website so it all fully operates as a WAP. I'll post up all my steps tomorrow incase it helps others. –  Sep 03 '13 at 22:47
0

For completeness and if anyone runs into a similar difficulties, below are the exact steps I took to convert the example website to a web application project

1) Use this walkthrough for the main conversion. The key points here are to copy ONLY the .dll's to the new project bin folder, then copy App_Code folder first and convert to Web Application before adding other pages and folders.

2) When the project is converted to a web app it's likely that some namespaces, classes and typenames may not update correctly or be different based on the name of your project. Generally the code behind does update correctly but the Web.Config TypeNames do not. The main ones I encountered were the theme classes and sp_cpanelTableAdapters of which there were approx 20 typenames to change, for example change

class admin_themes_default_default to class admin_themes_dark_default

TypeName="sp_cpanelTableAdapters.admin_HintsTableAdapter" to TypeName="myWSAT_WAP.xsd.sp_cpanelTableAdapters.admin_HintsTableAdapter"

3) The following shows the code to get Profiles working in this web application. I've only shown the replacement code for profileCommon in the user control membership-info.ascx - the code is practically the same in all other user controls so I won't repeat. Based on Jaroslaw Waliszko's answer, note the Web.Config now includes inherits="myWSAT_WAP.controls.wProfile" and now uses a standard profiles provider rather than a custom provider.

//ProfileInfo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

Namespace myWSAT_WAP.Controls
{
    [Serializable]
    public class Personal
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Gender { get; set; }
        public DateTime BirthDate { get; set; }
        public string Occupation { get; set; }
        public string Website { get; set; }
    }

    [Serializable]
    public class Address
    {
        public string Country { get; set; }
        public string Address1 { get; set; }
        public string AptNumber { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public string PostalCode { get; set; }
    }

    [Serializable]
    public class Contacts
    {
        public string DayPhone { get; set; }
        public string DayPhoneExt { get; set; }
        public string EveningPhone { get; set; }
        public string EveningPhoneExt { get; set; }
        public string CellPhone { get; set; }
        public string Fax { get; set; }

    }

    [Serializable]
    public class Company
    {
        public string CompanyName { get; set; }
        public string Address { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public string PostalCode { get; set; }
        public string Phone { get; set; }
        public string Fax { get; set; }
        public string Website { get; set; }

    }

    [Serializable]
    public class Preferences
    {
        public string Culture { get; set; }
        public string Newsletter { get; set; }

    }

    [Serializable]
    public class ProfileInfo
    {
        public Personal Personal { get; set; }
        public Address Address { get; set; }
        public Contacts Contacts { get; set; }
        public Company Company { get; set; }
        public Preferences Preferences { get; set; }
    }
}


//wProfile.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Profile;

Namespace myWSAT_WAP.Controls
{
    public class wProfile : ProfileBase
    {
        public ProfileInfo ProfileInfo
        {
            get { return (ProfileInfo)GetPropertyValue("ProfileInfo"); }
        }

        public static wProfile GetProfile()
        {
            return (wProfile)HttpContext.Current.Profile;
        }

        public static wProfile GetProfile(string userName)
        {
            return (wProfile)Create(userName);
        }
    }
}

//Web.config
    <profile defaultProvider="MyCMSSqlProfileProvider" automaticSaveEnabled="false" inherits="myWSAT_WAP.controls.wProfile">
      <providers>
        <clear/>
        <add name="MyCMSSqlProfileProvider" connectionStringName="dbMyCMSConnectionString" applicationName="MyCMS" type="System.Web.Profile.SqlProfileProvider"/>
      </providers>
      <properties>
        <group name="Personal">
          <add name="FirstName" type="String"/>
          <add name="LastName" type="String"/>
          <add name="Gender" type="String"/>
          <add name="BirthDate" type="DateTime"/>
          <add name="Occupation" type="String"/>
          <add name="Website" type="String"/>
        </group>
        <group name="Address">
          <add name="Country" type="String"/>
          <add name="Address" type="String"/>
          <add name="AptNumber" type="String"/>
          <add name="City" type="String"/>
          <add name="State" type="String"/>
          <add name="PostalCode" type="String"/>
        </group>
        <group name="Contacts">
          <add name="DayPhone" type="String"/>
          <add name="DayPhoneExt" type="String"/>
          <add name="EveningPhone" type="String"/>
          <add name="EveningPhoneExt" type="String"/>
          <add name="CellPhone" type="String"/>
          <add name="Fax" type="String"/>
        </group>
        <group name="Company">
          <add name="Company" type="String"/>
          <add name="Address" type="String"/>
          <add name="City" type="String"/>
          <add name="State" type="String"/>
          <add name="PostalCode" type="String"/>
          <add name="Phone" type="String"/>
          <add name="Fax" type="String"/>
          <add name="Website" type="String"/>
        </group>
        <group name="Preferences">
          <add name="Culture" type="String" defaultValue="en-US"/>
          <add name="Newsletter" type="String"/>
        </group>
      </properties>
    </profile>

//membership-info.ascx
    #region on page load get current profile

    protected void Page_Load(object sender, EventArgs e)
    {
        // Get Profile
        if (!Page.IsPostBack)
        {
            if (Page.User.Identity.IsAuthenticated)
            {
                // get country names from app_code folder
                // bind country names to the dropdown list
                ddlCountries.DataSource = CountryNames.CountryNames.GetCountries();
                ddlCountries.DataBind();

                // get state names from app_code folder
                // bind state names to the dropdown lists in address info and company info section
                ddlStates1.DataSource = UnitedStates.StateNames.GetStates();
                ddlStates1.DataBind();
                ddlStates2.DataSource = UnitedStates.StateNames.GetStates();
                ddlStates2.DataBind();

                // get the selected user's profile based on query string
                wProfile profile = wProfile.GetProfile();
                //profileCommon profile = Profile;

                // Subscriptions
                ddlNewsletter.SelectedValue = profile.GetProfileGroup("Preferences").GetPropertyValue("Newsletter").ToString();
                //ddlNewsletter.SelectedValue = profile.Preferences.Newsletter;

                // Personal Info
                txtFirstName.Text = profile.GetProfileGroup("Personal").GetPropertyValue("FirstName").ToString();
                txtLastName.Text = profile.GetProfileGroup("Personal").GetPropertyValue("LastName").ToString();
                ddlGenders.SelectedValue = profile.GetProfileGroup("Personal").GetPropertyValue("Gender").ToString();
                if ((DateTime)profile.GetProfileGroup("Personal").GetPropertyValue("BirthDate") != DateTime.MinValue)
                    txtBirthDate.Text = profile.GetProfileGroup("Personal").GetPropertyValue("BirthDate").ToString();
                ddlOccupations.SelectedValue = profile.GetProfileGroup("Personal").GetPropertyValue("Occupation").ToString();
                txtWebsite.Text = profile.GetProfileGroup("Personal").GetPropertyValue("Website").ToString();

                //txtFirstName.Text = profile.Personal.FirstName;
                //txtLastName.Text = profile.Personal.LastName;
                //ddlGenders.SelectedValue = profile.Personal.Gender;
                //if (profile.Personal.BirthDate != DateTime.MinValue)
                //    txtBirthDate.Text = profile.Personal.BirthDate.ToShortDateString();
                //ddlOccupations.SelectedValue = profile.Personal.Occupation;
                //txtWebsite.Text = profile.Personal.Website;

                // Address Info
                ddlCountries.SelectedValue = profile.GetProfileGroup("Address").GetPropertyValue("Country").ToString();
                txtAddress.Text = profile.GetProfileGroup("Address").GetPropertyValue("Address").ToString();
                txtAptNumber.Text = profile.GetProfileGroup("Address").GetPropertyValue("AptNumber").ToString();
                txtCity.Text = profile.GetProfileGroup("Address").GetPropertyValue("City").ToString();
                ddlStates1.SelectedValue = profile.GetProfileGroup("Address").GetPropertyValue("State").ToString();
                txtPostalCode.Text = profile.GetProfileGroup("Address").GetPropertyValue("PostalCode").ToString();

                //ddlCountries.SelectedValue = profile.Address.Country;
                //txtAddress.Text = profile.Address.Address;
                //txtAptNumber.Text = profile.Address.AptNumber;
                //txtCity.Text = profile.Address.City;
                //ddlStates1.SelectedValue = profile.Company.State;
                //txtPostalCode.Text = profile.Address.PostalCode;

                // Contact Info
                txtDayTimePhone.Text = profile.GetProfileGroup("Contacts").GetPropertyValue("DayPhone").ToString();
                txtDayTimePhoneExt.Text = profile.GetProfileGroup("Contacts").GetPropertyValue("DayPhoneExt").ToString();
                txtEveningPhone.Text = profile.GetProfileGroup("Contacts").GetPropertyValue("EveningPhone").ToString();
                txtEveningPhoneExt.Text = profile.GetProfileGroup("Contacts").GetPropertyValue("EveningPhoneExt").ToString();
                txtCellPhone.Text = profile.GetProfileGroup("Contacts").GetPropertyValue("CellPhone").ToString();
                txtHomeFax.Text = profile.GetProfileGroup("Contacts").GetPropertyValue("Fax").ToString();

                //txtDayTimePhone.Text = profile.Contacts.DayPhone;
                //txtDayTimePhoneExt.Text = profile.Contacts.DayPhoneExt;
                //txtEveningPhone.Text = profile.Contacts.EveningPhone;
                //txtEveningPhoneExt.Text = profile.Contacts.EveningPhoneExt;
                //txtCellPhone.Text = profile.Contacts.CellPhone;
                //txtHomeFax.Text = profile.Contacts.Fax;

                // Company Info
                txbCompanyName.Text = profile.GetProfileGroup("Company").GetPropertyValue("Company").ToString();
                txbCompanyAddress.Text = profile.GetProfileGroup("Company").GetPropertyValue("Address").ToString();
                txbCompanyCity.Text = profile.GetProfileGroup("Company").GetPropertyValue("City").ToString();
                ddlStates2.SelectedValue = profile.GetProfileGroup("Company").GetPropertyValue("State").ToString();
                txbCompanyZip.Text = profile.GetProfileGroup("Company").GetPropertyValue("PostalCode").ToString();
                txbCompanyPhone.Text = profile.GetProfileGroup("Company").GetPropertyValue("Phone").ToString();
                txbCompanyFax.Text = profile.GetProfileGroup("Company").GetPropertyValue("Fax").ToString();
                txbCompanyWebsite.Text = profile.GetProfileGroup("Company").GetPropertyValue("Website").ToString();

                //txbCompanyName.Text = profile.Company.Company;
                //txbCompanyAddress.Text = profile.Company.Address;
                //txbCompanyCity.Text = profile.Company.City;
                //ddlStates2.SelectedValue = profile.Company.State;
                //txbCompanyZip.Text = profile.Company.PostalCode;
                //txbCompanyPhone.Text = profile.Company.Phone;
                //txbCompanyFax.Text = profile.Company.Fax;
                //txbCompanyWebsite.Text = profile.Company.Website;

                // Subscriptions
                ddlNewsletter.SelectedValue = profile.GetProfileGroup("Preferences").GetPropertyValue("Newsletter").ToString();

                //ddlNewsletter.SelectedValue = profile.Preferences.Newsletter;
            }
        }
    }

    #endregion

    #region Update current Profile Sub

    public void SaveProfile()
    {
        if (Page.User.Identity.IsAuthenticated)
        {
            // get the selected user's profile
            wProfile profile = wProfile.GetProfile();
            //ProfileCommon profile = Profile;

            // Personal Info
            profile.GetProfileGroup("Personal").SetPropertyValue("FirstName", txtFirstName.Text);
            profile.GetProfileGroup("Personal").SetPropertyValue("LastName", txtLastName.Text);
            profile.GetProfileGroup("Personal").SetPropertyValue("Gender", ddlGenders.SelectedValue);
            if (txtBirthDate.Text.Trim().Length > 0)
                profile.GetProfileGroup("Personal").SetPropertyValue("BirthDate", DateTime.Parse(txtBirthDate.Text));
            profile.GetProfileGroup("Personal").SetPropertyValue("Occupation", ddlOccupations.SelectedValue);
            profile.GetProfileGroup("Personal").SetPropertyValue("Website", txtWebsite.Text);

            //profile.Personal.FirstName = txtFirstName.Text;
            //profile.Personal.LastName = txtLastName.Text;
            //profile.Personal.Gender = ddlGenders.SelectedValue;
            //if (txtBirthDate.Text.Trim().Length > 0)
            //    profile.Personal.BirthDate = DateTime.Parse(txtBirthDate.Text);
            //profile.Personal.Occupation = ddlOccupations.SelectedValue;
            //profile.Personal.Website = txtWebsite.Text;

            // Address Info
            profile.GetProfileGroup("Address").SetPropertyValue("Country", ddlCountries.SelectedValue);
            profile.GetProfileGroup("Address").SetPropertyValue("Address", txtAddress.Text);
            profile.GetProfileGroup("Address").SetPropertyValue("AptNumber", txtAptNumber.Text);
            profile.GetProfileGroup("Address").SetPropertyValue("City", txtCity.Text);
            profile.GetProfileGroup("Address").SetPropertyValue("State", ddlStates1.Text);
            profile.GetProfileGroup("Address").SetPropertyValue("PostalCode", txtPostalCode.Text);

            //profile.Address.Country = ddlCountries.SelectedValue;
            //profile.Address.Address = txtAddress.Text;
            //profile.Address.AptNumber = txtAptNumber.Text;
            //profile.Address.City = txtCity.Text;
            //profile.Address.State = ddlStates1.Text;
            //profile.Address.PostalCode = txtPostalCode.Text;

            // Contact Info
            profile.GetProfileGroup("Contacts").SetPropertyValue("DayPhone", txtDayTimePhone.Text);
            profile.GetProfileGroup("Contacts").SetPropertyValue("DayPhoneExt", txtDayTimePhoneExt.Text);
            profile.GetProfileGroup("Contacts").SetPropertyValue("EveningPhone", txtEveningPhone.Text);
            profile.GetProfileGroup("Contacts").SetPropertyValue("EveningPhoneExt", txtEveningPhoneExt.Text);
            profile.GetProfileGroup("Contacts").SetPropertyValue("CellPhone", txtCellPhone.Text);
            profile.GetProfileGroup("Contacts").SetPropertyValue("Fax", txtHomeFax.Text);

            //profile.Contacts.DayPhone = txtDayTimePhone.Text;
            //profile.Contacts.DayPhoneExt = txtDayTimePhoneExt.Text;
            //profile.Contacts.EveningPhone = txtEveningPhone.Text;
            //profile.Contacts.EveningPhoneExt = txtEveningPhoneExt.Text;
            //profile.Contacts.CellPhone = txtCellPhone.Text;
            //profile.Contacts.Fax = txtHomeFax.Text;

            // Company Info
            profile.GetProfileGroup("Company").SetPropertyValue("Company", txbCompanyName.Text);
            profile.GetProfileGroup("Company").SetPropertyValue("Address", txbCompanyAddress.Text);
            profile.GetProfileGroup("Company").SetPropertyValue("City", txbCompanyCity.Text);
            profile.GetProfileGroup("Company").SetPropertyValue("State", ddlStates2.SelectedValue);
            profile.GetProfileGroup("Company").SetPropertyValue("PostalCode", txbCompanyZip.Text);
            profile.GetProfileGroup("Company").SetPropertyValue("Phone", txbCompanyPhone.Text);
            profile.GetProfileGroup("Company").SetPropertyValue("Fax", txbCompanyFax.Text);
            profile.GetProfileGroup("Company").SetPropertyValue("Website", txbCompanyWebsite.Text);

            //profile.Company.Company = txbCompanyName.Text;
            //profile.Company.Address = txbCompanyAddress.Text;
            //profile.Company.City = txbCompanyCity.Text;
            //profile.Company.State = ddlStates2.SelectedValue;
            //profile.Company.PostalCode = txbCompanyZip.Text;
            //profile.Company.Phone = txbCompanyPhone.Text;
            //profile.Company.Fax = txbCompanyFax.Text;
            //profile.Company.Website = txbCompanyWebsite.Text;

            // Subscriptions
            profile.GetProfileGroup("Preferences").SetPropertyValue("Newsletter", ddlNewsletter.SelectedValue);

            //profile.Preferences.Newsletter = ddlNewsletter.SelectedValue;

            // this is what we will call from the button click
            // to save the user's profile
            profile.Save();
        }
    }

    #endregion