Reputation:
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
Upvotes: 5
Views: 1824
Reputation:
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
Upvotes: 0
Reputation: 17064
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?
Upvotes: 2
Reputation: 27944
Your Membership.GetUser()
returns null, this can be caused by:
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".
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.
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
}
Upvotes: 3
Reputation: 9166
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);
Upvotes: 3