3

我最近开始修补 ASP.NET MVC,但这个问题也应该适用于经典的 ASP.NET。对于它的价值,我也不太了解表单身份验证和成员资格提供程序。

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

据我了解,在 ASP.NET 中执行此操作的标准方法是创建一个 没有额外信息的用户表,然后创建一个包含额外信息的“配置文件”表。但是,这对我来说听起来不是很好,因为每当我需要访问这些额外信息时,我都必须进行一次额外的数据库查询才能获得它。

我在“C# 2008 中的 Pro ASP.NET 3.5”一书中读到,如果您需要大量访问配置文件表并且在您的网站中有许多不同的页面,那么为配置文件创建一个单独的表并不是一个好主意。

现在解决手头的问题...正如我所说,我正在编写自己的自定义MembershipProvider子类,到目前为止进展顺利,但现在我意识到这CreateUser不允许我以这种方式创建用户我想要。该方法只接受固定数量的参数,名字、姓氏和居住国家不是其中的一部分。

那么,如果没有这些信息,我将如何在我的自定义表中为新用户创建一个CreateUser条目MembershipProvider

4

2 回答 2

3

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

于 2010-04-21T14:42:40.203 回答
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 的成员资格提供程序来创建用户并保存配置文件数据,但对于您的最终用户来说,这是一个单一的原子操作。

于 2010-04-21T14:17:17.633 回答