我正在使用内置的 ASP.NET 成员数据库架构来处理用户和配置文件。我已经构建了一个继承自System.Web.Profile.ProfileBase的自定义配置文件。在解决方案的某些部分,数据从数据库中列出并呈现在 html 表中。在此列表后面的代码中,由当前登录用户的用户名过滤。
例子:
if (usernameString.Equals(MyCustomProfile.UserName))`
// add to list
myRepeater.DataSource = myFilteredList;
myRepeater.DataBind();
这适用于所有浏览器。但在一些经过测试的设备上:iPad、iPhone,有时在 Internet Explorer 8 中,该列表是空的。我的第一个想法是它与 JavaScript/HTML/CSS 相关的东西导致了这种情况。在调试会话之后,我发现在这些情况下 UserName 属性的值是大写的。该值来自 .NET ProfileBase 类,因此无需自定义操作。
我已经使用内置的System.Web.Security.Membership类测试了相同的比较方法。它以大写形式返回用户名。
例子:
var user = Membership.GetUser();
if (usernameString.Equals(user.UserName))
// add to list
为了暂时解决这个问题,我一直在覆盖 ProfileBase 中的 UserName 属性:
public new string UserName
{
get
{
return base.UserName.ToLower();
}
}
aspnet_Users 标准表有两列保存用户名:UserName 和LoweredUserName。查看数据库,没有大写的用户名。那么这是怎么发生的呢?