我在网站中使用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());
}
答案 0 :(得分:5)
默认情况下,配置文件在ASP.NET页面执行结束时自动保存,请参阅profile Element (ASP.NET Settings Schema)文档。这解释了你观察到的第二个“神秘”豁免。
您可以尝试将automaticSaveEnabled
更改为false。
答案 1 :(得分:0)
所有交易必须在页面卸载之前完成。 如果页面被卸载,那么它的所有函数调用也将在中途被删除或停止。
答案 2 :(得分:0)
应该通过HttpContext.Current.Profile访问ProfileCommon,因为这是对当前用户的配置文件的引用(登录或匿名),您不需要显式调用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();
}
答案 3 :(得分:0)
您可能需要清除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>
这是一个很好的解释: Removing existing profile providers
这是另一个好网站: http://odetocode.com/articles/440.aspx