c# - ASP.NET 配置文件保存被旧值覆盖

标签 c# asp.net sql-server-2005 asp.net-profiles

我正在使用 ASP.NET 的配置文件功能在一个网站上。更新配置文件运行异常!用户不能更新他/她自己的个人资料,无论是网站用户还是管理员,但管理员可以更新其他用户的个人资料。

在后端,调用 Profile 的 save() 后,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());
    }

最佳答案

配置文件默认在 ASP.NET 页面执行结束时自动保存,参见 profile Element (ASP.NET Settings Schema)有关此的文档。这解释了您观察到的第二个“神秘”保存。

你可以尝试将automaticSaveEnabled改为false。

关于c# - ASP.NET 配置文件保存被旧值覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6223003/

相关文章:

sql - 如何在 SELECT FOR XML 查询中选择返回的列名?

sql-server - 是否可以在不使用名称的情况下查询 SQL Server 中的系统数据库?

c# - 为页面ClientScript中的Registered Hidden Field赋值

c# - 创建插件应用程序的方法

c# - 我应该为每个类别使用单独的表还是一个表来存储分类网站的所有属性?

c# - 使用 ASP.NET 通过 SSH 自动化 Unix 服务器

sql-server - SQL Server 2005 - 触发循环?

c# - 如何使用 Bouncy CaSTLe 解密 AES/CCM 加密密文?

c# - 将单个数字转换为多于 2 位数字

asp.net - DevExpress:带有 WebForms 和 Entity Framework 的 XtraGrid