Профили, не работающие с веб-приложением в ASP.NET
Я работаю с профилями в веб-приложении ASP.NEt. Я перепробовал все безрезультатно.
первый: мой файл web.config выглядит следующим образом:
<system.web>
<anonymousIdentification enabled="true" />
...
<profile defaultProvider="DovoCosmeticFashionProfileProvider" automaticSaveEnabled="false">
<providers>
<add name="DovoCosmeticFashionProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="LocalSqlServer" applicationName="DovoCosmeticFashionMembership" />
</providers>
<properties>
<add name="FirstName" type="String" allowAnonymous="true"/>
<add name="LastName" type="String" allowAnonymous="true"/>
<add name="Birthdate" type="DateTime" allowAnonymous="true"/>
<add name="Mobile" type="String" allowAnonymous="true"/>
<add name="Address" type="DovoCosmeticFashion.Entities.Address" allowAnonymous="true"/>
<add name="Cart" type="DovoCosmeticFashion.Entities.ShoppingCart" allowAnonymous="true"/>
</properties>
</profile>
и у меня есть CreateUserWizard с тремя шагами: мой собственный шаг (для сбора информации о профиле), CreateUserWizardStep и CompleteWizardStep.
Первая проблема заключается в том, что когда я сохраняю информацию о профиле в моем объекте пользовательского профиля:
public class ProfileCommon : ProfileBase
{
public String FirstName
{
get
{
return (String)HttpContext.Current.Profile.GetPropertyValue("FirstName");
}
set
{
HttpContext.Current.Profile.SetPropertyValue("FirstName", value);
}
}
public String LastName
{
get
{
return (String)HttpContext.Current.Profile.GetPropertyValue("LastName");
}
set
{
HttpContext.Current.Profile.SetPropertyValue("LastName", value);
}
}
public DateTime Birthdate
{
get
{
return (DateTime)HttpContext.Current.Profile.GetPropertyValue("Birthdate");
}
set
{
HttpContext.Current.Profile.SetPropertyValue("Birthdate", value);
}
}
public String Mobile
{
get
{
return (String)HttpContext.Current.Profile.GetPropertyValue("Mobile");
}
set
{
HttpContext.Current.Profile.SetPropertyValue("Mobile", value);
}
}
public Address address
{
get
{
return (Address)HttpContext.Current.Profile.GetPropertyValue("Address");
}
set
{
HttpContext.Current.Profile.SetPropertyValue("Address", value);
}
}
public ShoppingCart Cart
{
get
{
return (ShoppingCart)HttpContext.Current.Profile.GetPropertyValue("Cart");
}
set
{
HttpContext.Current.Profile.SetPropertyValue("Cart", value);
}
}
}
Все работало нормально до тех пор, пока не сработало событие Profile_MigrateAnonymous, вы знаете, что оно сохранило информацию профиля и дало мне много исключений. Случилось так, что это событие сработало как последнее событие в жизненном цикле веб-страницы (после выполнения кода на странице просмотра) и я не смог получить доступ к какой-либо переменной в анонимном профиле или даже в сеансе (они недоступны, и, кстати, я был удивлен, что пользователь еще не прошел аутентификацию), и вы знаете, что при использовании веб-приложения вы можете получить доступ к профилю, используя метод "Создать", а не метод "GetProfile", например: ProfileBase profileBase = ProfileBase.Create(pe.AnonymousID); или HttpContext.Current.Profile;
Во-вторых: после многих попыток и из-за того, что пользователь еще не прошел аутентификацию, как упоминалось ранее, я заменяю первый и второй шаги элемента управления CreateUserWizard следующим образом: сначала "CreateUserWizardStep", а затем мой собственный шаг (для сбора информации профиля), и я удалил Profile_MigrateAnonymous и обработал событие FinishButtonClick:
protected void RegisterUser_FinishButtonClick(object sender, WizardNavigationEventArgs e)
{
if (User.Identity.IsAuthenticated)
{
.....
Profile.Save();
}
}
теперь он работал без каких-либо исключений, но ничего не было сохранено в таблицу aspnet_Profile OOOOOOOPs.
я изменил ProfileCommon следующим образом:
public class ProfileCommon : ProfileBase
{
private ProfileBase Profile = null;
public ProfileCommon()
{
GetProfile();
}
public ProfileCommon(string username)
{
GetProfile(username);
}
public ProfileBase GetProfile()
{
if (Profile == null)
{
Profile = ProfileBase.Create(HttpContext.Current.User.Identity.Name);
return Profile;
}
else
{
return Profile;
}
}
public ProfileBase GetProfile(string username)
{
if (Profile == null)
{
Profile = ProfileBase.Create(username);
return Profile;
}
else
{
return Profile;
}
}
public String FirstName
{
get
{
return (String)Profile.GetPropertyValue("FirstName");
}
set
{
Profile.SetPropertyValue("FirstName", value);
}
}
public String LastName
{
get
{
return (String)Profile.GetPropertyValue("LastName");
}
set
{
Profile.SetPropertyValue("LastName", value);
}
}
public DateTime Birthdate
{
get
{
return (DateTime)Profile.GetPropertyValue("Birthdate");
}
set
{
Profile.SetPropertyValue("Birthdate", value);
}
}
public String Mobile
{
get
{
return (String)Profile.GetPropertyValue("Mobile");
}
set
{
Profile.SetPropertyValue("Mobile", value);
}
}
public Address address
{
get
{
return (Address)Profile.GetPropertyValue("Address");
}
set
{
Profile.SetPropertyValue("Address", value);
}
}
public ShoppingCart Cart
{
get
{
return (ShoppingCart)Profile.GetPropertyValue("Cart");
}
set
{
Profile.SetPropertyValue("Cart", value);
}
}
}
и снова напрасно.
Третье: я не знаю, лучше ли использовать: HttpContext.Current.Profile или ProfileBase.Create(HttpContext.Current.User.Identity.Name) в случае аутентификации пользователя. потому что если вы сохраните информацию в одном из них (используя метод SetPropertyValue), она не будет передана другому объекту.
Может ли какой-либо орган ответить на мои вопросы выше и сказать, есть ли способ сохранить информацию в профиле. Также, если есть лучший способ сохранить информацию профиля, например, сохранить ее в другой таблице, в которой в качестве первичного ключа используется "UserId", особенно если мне нужна разная информация (свойства) для разных ролей.
любая помощь будет оценена.
1 ответ
Кажется, никто не заботится об этих вопросах:-) У меня есть этот открытый провайдер профиля SQL и пока нет ответа..