所以,我正在创建一个ASP.NET MVC网站。
它有一个相当复杂的用户注册页面,包含很多字段。我的问题是,我应该坚持到底这一点?由成员资格提供者工具创建的用户表不包含这些列,我对于存储有关每个用户的附加信息的最佳做法感到困惑吗?
这是配置文件提供商发挥作用的地方吗?他们是如何工作的?如果没有,您如何坚持并存储MembershipProvider表的stock列中未提供的其他用户详细信息?
任何人都可以向我指出如何处理这些资源,如何在需要时访问这些额外的用户详细信息,如何使用所有这些信息创建新用户等。
答案 0 :(得分:3)
这是ASP.NET配置文件提供程序的用武之地。您可以使用它来存储您想要的有关用户的任何配置文件信息。您需要做的就是在web.config文件MSDN Link on how to configure the profile fields in web.config file中添加所需的字段。要对文章进行总结,只需将要存储的名称和类型值添加到profile元素的properties节点即可。这是一个例子:
<profile enabled="true">
<properties>
<add name="Name" />
<group name="Address">
<add name="Street" />
<add name="City" />
<add name="Zip" type="System.Int32" />
</group>
</properties>
</profile>
在ASP.NET Webforms中,Visual Studio会自动创建一个强类型的配置文件类,该类将引用您的自定义配置文件属性。在MVC中,这不会发生。要引用用户的个人资料信息,只需调用HttpContext.Profile [“PropertyName”]即可。一个例子:
HttpContext.Profile["Name"] = name;
HttpContext.Profile.GetProfileGroup("Address")["Zip"] = zip;
编辑:正如Andy所说,如果你想对这些属性运行查询,使用默认的SqlProfileProvider并不是很好。他是完全正确的,也许我应该最初注意到这个限制。存在此限制是因为SqlProfileProvider将所有配置文件数据存储在三列中:PropertyNames和PropertyValuesString / PropertyValuesBinary。所有的键都存储在PropertyNames字段中,可以存储为字符串的值存储在PropertyValuesString字段等中。这意味着执行查询非常困难,例如“选择*来自aspnet_Profile,其中Age&gt; 10”。
答案 1 :(得分:3)
我不确定是否有最佳做法,这实际上取决于您希望如何使用这些信息。
首先,您必须认识到成员身份和个人资料是两个独立的事情。 ASP.NET成员资格,配置文件和角色功能旨在用作服务,为多个站点/应用程序提供服务。
如果查看这些关系的架构,您会注意到用户对系统是唯一的,但用户可以跨应用程序共享。这意味着他们的个人资料信息也可以在应用程序之间共享。成员资格实际上是用户与应用程序的关联,包含与特定应用程序的关系信息(密码,密码Q&amp; A等)。
您可以像Ryan建议的那样使用配置文件提供程序,但1)如果您想收集配置文件度量标准,则不容易查询信息; 2)它在成员资格/配置文件服务的所有使用者之间共享。但是,您可以扩展它以满足您的需求。
您可以像Gortok建议的那样扩展成员资格提供程序,并且该信息将与应用程序相关,但您需要确保不会以更改方式修改现有存储过程或表来破坏服务的现有使用者他们的界面或意图。
另一个选择是您可以将其视为服务并自行跟踪此信息,使用asp.net sql提供程序中的用户ID引用您自己的配置文件实现。
在Membership, Profiles, and Roles上有一个很好的系列(16个部分),来自Rolla的4个家伙,我建议阅读,然后,一旦你熟悉了所有的活动部分,做出一个有根据的教育决定最佳存储位置以及如何最好地构建您希望创建的配置文件信息。
答案 2 :(得分:2)
我知道这篇文章已发布很长时间了,问题的背景可能是mvc2或更早版本。
现在是mvc3,我想也许其他寻求mvc5上下文答案的人可能会对这个解决方案感兴趣。
在启用了单个用户帐户的标准mvc5项目中 您将在{Project} /Models/IdentityModel.cs
中找到以下代码块。// You can add profile data for the user by adding more properties to your ApplicationUser class, please visit http://go.microsoft.com/fwlink/?LinkID=317594 to learn more.
public class ApplicationUser : IdentityUser
{
}
只需在此类中添加更多属性,属性将持久保存到数据库中 例如。
public class ApplicationUser : IdentityUser
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public bool Active { get; set; }
public DateTime DateRegistered { get; set; }
}
答案 3 :(得分:1)
来自article 的CODE Magazine帮我解决了这个问题。