Сохранение профиля ASP.NET перезаписано старыми значениями - PullRequest
7 голосов
/ 03 июня 2011

Я использую функцию профиля ASP.NET на веб-сайте.Обновление профиля работает странно!Пользователь не может обновить свой собственный профиль, ни пользователь веб-сайта, ни администратор, но администратор может обновлять профили других пользователей.

В серверной части после сохранения профиля ()вызванные трассировки SQL Server показывают, что aspnet_Profile_SetProperties хранимая процедура вызывается дважды.Сначала с новыми значениями, затем со старыми значениями.Второе выполнение выполняется после выгрузки страницы.Мой код не имеет ничего общего с транзакциями.

Почему он работает так странно?

Может ли быть проблема с установкой aspnet_regsql , поскольку я установил удаленный иснова установил его!?

Код

web.config

<authentication mode="Forms">
    <forms name="FormsAuthentication" loginUrl="~/Login.aspx" defaultUrl="~/Login.aspx" timeout="20"/>
</authentication>
<membership defaultProvider="CustSqlMembershipProvider">
    <providers>
        <add connectionStringName="connString" applicationName="/space_online" minRequiredPasswordLength="5" minRequiredNonalphanumericCharacters="0" name="CustSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider"/>
    </providers>
</membership>
<roleManager enabled="true" defaultProvider="CustSqlRoleProvider">
    <providers>
        <add connectionStringName="connString" applicationName="/space_online" name="CustSqlRoleProvider" type="System.Web.Security.SqlRoleProvider"/>
    </providers>
</roleManager>
<anonymousIdentification cookieless="AutoDetect" enabled="true"/>
<profile defaultProvider="CustSqlProfileProvider" enabled="true">
    <providers>
        <add name="CustSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="connString" applicationName="/space_online"/>
    </providers>
    <properties>
        <add name="FirstName" type="System.String"/>
        <add name="LastName" type="System.String"/>
        <add name="Email" type="System.String"/>
        <group name="Address">
            <add name="Street" type="System.String"/>
            <add name="City" type="System.String"/>
            <add name="PostalCode" type="System.String"/>
        </group>
        <group name="Contact">
            <add name="Phone" type="System.String"/>
            <add name="Mobile" type="System.String"/>
            <add name="Fax" type="System.String"/>
        </group>
        <add name="ShoppingCart" type="psb.website.BLL.Store.ShoppingCart" serializeAs="Binary" allowAnonymous="true"/>
    </properties>
</profile>

Код позади

private void UpdateProfile(ProfileCommon myprofile)
{
    myprofile.FirstName = tbFirstName.Text.Trim();
    myprofile.LastName = tbLastName.Text.Trim();
    myprofile.Email = tbEmail.Text.Trim();
    myprofile.Address.Street = tbStreetPhysical.Text.Trim();
    myprofile.Address.City = tbCity.Text.Trim();
    myprofile.Address.PostalCode = tbPostalCode.Text.Trim();
    myprofile.Contact.Phone = tbPhone1.Text.Trim();
    myprofile.Contact.Mobile = tbMobile.Text.Trim();
    myprofile.Save();
}
private ProfileCommon GetProfile()
    {
        ProfileCommon profile = this.Profile;
        if (Request.QueryString["UserName"] != null && HttpContext.Current.User.IsInRole("Admin"))
            profile = this.Profile.GetProfile(Request.QueryString["UserName"].ToString());
        else
            profile = this.Profile.GetProfile(HttpContext.Current.User.Identity.Name);
        return profile;
    }
protected void tbUpdateProfile_Click(object sender, ImageClickEventArgs e)
    {
        UpdateProfile(GetProfile());
    }

Ответы [ 4 ]

5 голосов
/ 09 июня 2011

Профиль по умолчанию автоматически сохраняется в конце выполнения страницы ASP.NET, см. Документацию к элементу профиля (Схема настроек ASP.NET) .Это объясняет второе «таинственное» сохранение, которое вы наблюдаете.

Вы можете попытаться изменить automaticSaveEnabled на false.

0 голосов
/ 10 июня 2011

Может потребоваться очистить поставщика по умолчанию в вашем файле web.config. Как это:

<profile defaultProvider="CustSqlProfileProvider" enabled="true">
    <providers>
        <clear /><!-- here -->
        <add name="CustSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="connString" applicationName="/space_online"/>
    </providers>
    <properties>
        <...>
    </properties>
</profile>

Вот хорошее объяснение этому: Удаление существующих провайдеров профиля

А вот еще один хороший сайт: http://odetocode.com/articles/440.aspx

0 голосов
/ 09 июня 2011

Доступ к ProfileCommon должен осуществляться через HttpContext.Current.Profile, так как это ссылка на профиль текущего пользователя (вошел в систему или анонимный), и вам не нужно явно вызывать Save. Попробуйте это:

private void UpdateProfile()
{
    var myprofile = HttpContext.Current.Profile as ProfileCommon;

    if (profile == null) {
        throw new InvalidOperationException("HttpContext.Current.Profile is not of type ProfileCommon for some reason!");
    }

    myprofile.FirstName = tbFirstName.Text.Trim();
    myprofile.LastName = tbLastName.Text.Trim();
    myprofile.Email = tbEmail.Text.Trim();
    myprofile.Address.Street = tbStreetPhysical.Text.Trim();
    myprofile.Address.City = tbCity.Text.Trim();
    myprofile.Address.PostalCode = tbPostalCode.Text.Trim();
    myprofile.Contact.Phone = tbPhone1.Text.Trim();
    myprofile.Contact.Mobile = tbMobile.Text.Trim();
}
0 голосов
/ 03 июня 2011

все транзакции должны быть выполнены до выгрузки страницы. если страница выгружена, то все ее вызовы функций также будут удалены или остановлены на полпути.

...