2

我正在尝试在 Mvc 4 应用程序中编写自己的帐户注册逻辑。我从一个基本模板开始,而不是互联网模板。目前我有一个Tenant具有许多属性的模型。首先使用代码,我在我的数据库中创建了一个租户表(随着时间的推移会添加更多模型和表 - 我只是想让一个先工作)。

我创建了一个RegisterTenantModel - 类似于 Internet 模板中的那个,除了我使用的是电子邮件而不是用户名。

public class TenantRegisterModel
{
    [Required]
    [Display(Name="Email")]
    public string Email { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm password")]
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }
}

在下面的RegisterTenant方法中,我想:

  • 允许用户(租户)最初仅使用电子邮件地址和密码进行注册,并且仅在通过电子邮件验证其帐户后才允许他们输入与租户相关的其余属性,因此使用TenantRegisterModel.

在调用Membership.CreateUser时,我怎么知道model.Email并将model.Password被添加到Tenant表中?同样,如果我对 a 执行与上述相同的场景,Landlord我怎么知道输入的详细信息已添加到Landlord表中?有没有办法Membership.CreateUser我也可以指定要添加用户详细信息的表?

注册租户:

public ActionResult RegisterTenant(TenantRegisterModel model)
    {
        if (ModelState.IsValid)
        {
            // Attempt to register a tenant account
            MembershipCreateStatus createStatus;
            Membership.CreateUser(model.Email, model.Password);
            // ...
        }
    }

我当然有一个上下文类,目前有public DbSet<LetLord.Models.Tenant> Tenants { get; set; },那么如果我有多个 DbSet,我如何知道正在添加用户详细信息的表?

4

3 回答 3

2

MVC 4 不使用与 MVC 3 相同的成员资格。您想查找 simplemembership。对于为用户存储额外数据的常见问题,这实际上是一个非常好的解决方案。

http://weblogs.asp.net/jgalloway/archive/2012/08/29/simplemembership-membership-providers-universal-providers-and-the-new-asp-net-4-5-web-forms-and- asp-net-mvc-4-templates.aspx

这是开始阅读它的好地方。不确定您对 MVC3 Membership Provider 和 Database Schema 有多熟悉,但这在 MVC4 中发生了很大变化。我花了一段时间才找到一切。

基本上,使用新设置,您可以使用所需的任何信息创建自己的用户表,并简单地将数据库的 1 列映射为 id(现在是一个 int,而不是像 mvc3 成员资格提供程序和模式那样的(guid))和“用户名”可以是电子邮件或任何类似的唯一标识符

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: false);

您将连接字符串链接到数据库,它将使用该数据库创建成员资格模式。然后,您可以将模型添加到您的上下文中,并为 dbcontext.UserProfile.FirstName 等函数使用实体框架。

这是一些更多的起点材料

http://patrickdesjardins.com/blog/asp-net-membership-with-mvc4

祝你好运

于 2012-12-11T17:22:43.647 回答
1

您可能应该Membership自己实现并将其注册为MembershipProvider您的 web.config。通过这种方式,您可以完全控制数据发生的情况,并且您仍然拥有所有不错的功能。

MVC3 中有一个示例项目,它实现了 Code-first Membership- 和 Roleprovider,它可以让您了解它是如何完成的。

或者,您可以使用 ProfileProvider 保存一些激活密钥(和您的其他自定义用户字段)并将用户添加到某些角色,例如"NotActivated".

更新:据我所知,标准 Membership-Provider 使用 web.config 中的 DefaultConnection。如果您在同一个数据库中使用 Code-First,它会中断,因为有一个结构不是由 code-first 构成的。我认为,您可以选择使用数据库优先。

于 2012-12-11T15:23:58.217 回答
0

我怎么知道 model.Email 和 model.Password 将被添加到 Tenant 表中?

我向 UserProfile 模型添加了其他属性。然后在CreateUserAndAccount方法中我动态地传递属性如下:

WebSecurity.CreateUserAndAccount(model.UserName, model.Password, 
                                            new { Email = model.Email,
                                                  FirstName = model.FirstName,
                                                  LastName = model.LastName,
                                                  AccountType = model.AccountType,
                                                  DaytimeContactNumber = "",
                                                  EveningContactNumber = "" },
                                            false);

同样,如果我为房东执行上述相同的场景,我怎么知道输入的详细信息正在添加到房东表中?Membership.CreateUser 有没有办法我也可以指定要添加用户详细信息的表?

我为房东和租户创建了角色,并且在RegisterCreateUserAndAccount检查了 enum 的值之后AccountType

if (model.AccountType == AccountType.Tenant)
                {
                    try
                    {
                        Roles.AddUserToRole(model.UserName, "Tenant");
                    }
                    catch (Exception e)
                    {
                        ModelState.AddModelError("Unable to add user to role", e);
                    }
                }
于 2013-01-22T00:22:23.543 回答