ASP.NET:使用自定义用户表实现自定义MembershipProvider

3

我最近开始尝试使用ASP.NET MVC进行编程,但这个问题同样适用于经典的ASP.NET。值得一提的是,我对表单验证和成员提供程序并不了解。

我正在尝试编写自己的MembershipProvider,该提供程序将连接到我的数据库中的自定义用户表。我的用户表包含所有基本的用户信息,例如用户名、密码、密码盐、电子邮件地址等,还包括名字、姓氏和居住国家等信息。

据我所知,在ASP.NET中处理这种情况的标准方法是创建一个没有额外信息的用户表,然后再创建一个“配置文件”表来存储额外信息。然而,我认为这并不是一个很好的方法,因为每当我需要访问那些额外信息时,都必须进行一次额外的数据库查询。

我在书籍《Pro ASP.NET 3.5 in C# 2008》中读到,如果您需要频繁访问配置文件表并且网站中有许多不同的页面,则为配置文件单独创建一个表不是一个很好的主意。

现在遇到的问题是...正如我所说,我正在编写自己的自定义MembershipProvider子类,目前进展顺利,但现在我已经意识到CreateUser不允许我按照自己的方式创建用户。该方法只接受固定数量的参数,名字、姓氏和居住国家并不包括在其中。

那么,在我的MembershipProviderCreateUser中没有这些信息的情况下,如何为新用户在我的自定义表中创建一个条目呢?

2个回答

3

我认为你应该继续你的方法并在你的实现中添加一个新功能,我的意思是,重载CreateUser方法,并将CustomMembershipUser(扩展MembershipUser)作为参数。这样,在使用提供程序之前,将其转换为CustomMembershipProvider并使用重载的方法。


+1 - 虽然我必须说可以进行大量缓存以减轻负载,但如果坚决不使用简单的成员资格/个人资料策略,则过载 xxxUser 方法是正确的方法。 - Sky Sanders
有趣...我看了一个视频教程,其中有人实现了一个自定义的MembershipProvider,在CreateUser中他返回了null。返回值不应该用于任何事情吗? - Deniz Dogan

2

我同意你的分析,认为你应该将会员和个人资料信息存储在同一张表中。由于你正确地指出了CreateUser所能接受的参数数量的限制,因此你需要设计字段以使非会员个人资料属性可为空。这并不意味着你在数据库中会有必填字段为空的情况。相反,你可以使用以下代码段:

string username = .../ retrieve username here

Membership.CreateUser(username , password, email);

ProfileBase newProfile = Profile.Create(username); //since the user has just been created, all properties will be blank

//set all entered properties
newProfile.SetPropertyValue("MyProp1", myProp1Value);
... 
newProfile.SetPropertyValue("MyPropN", myPropNValue);

newProfile.Save();

以此方式,您可以利用ASP.NET的成员资格提供程序创建用户并保存配置文件数据,但对于最终用户来说,这是一个单一的原子操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接