在MVC 3中存储额外用户信息的简单方法?

时间:2013-03-10 04:41:55

标签: c# asp.net-mvc-3 registration

第一次使用ASP.NET MVC 3并且真的很难做到应该非常简单的事情。

我有一个使用内置成员资格功能的用户注册,但我想存储他们的名字和姓氏,这些不是默认提供的属性。

我无法弄清楚如何将这些属性添加到MembershipUser类中(如果这甚至是正确的类,那么很难弄清楚这里发生了什么)。我还尝试创建一个新的“UserDetails”模型,但无法弄清楚如何使用UserID作为外键将其链接到常规用户表。

使用Code First方法在ASP.NET MVC 3 Web应用程序中存储额外用户信息的正确方法是什么?我必须在这里做错事,因为这必须是脑死亡的简单。我看到自定义配置文件提供程序的内容对于这样的基本功能来说似乎太过分了。

任何人都能指出我正确的方向吗?感谢。

2 个答案:

答案 0 :(得分:0)

您需要在RegisterModel中添加这些属性,如下所示:

 public class RegisterModel
    {
        [Required]
        [Display(Name = "User name")]
        public string UserName { get; set; }

        [Required]
        [DataType(DataType.EmailAddress)]
        [Display(Name = "Email address")]
        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")]
        [System.Web.Mvc.Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
        public string ConfirmPassword { get; set; }
       //Put annotatons as needed
        public string FirstName {get;set;}
        public string LastName {get;set;}
    }

在此之后,您需要使用Register中的AccountController方法将这些详细信息放入数据库中。这可以通过从UserId获取Membership并将额外的详细信息放在数据库中与此UserId完全不同的表中来管理。此表格如下:

public class ExtendedUser
{
    [Key]
    public Guid UserId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

因此,使用Register注释的[HttpPost]方法会更改为以下内容,以便将数据存储在上表中。

[HttpPost]

public ActionResult Register(RegisterModel model)
{
    if (ModelState.IsValid)
    {
        // Attempt to register the user
        MembershipCreateStatus createStatus;
        Membership.CreateUser(model.UserName, model.Password, model.Email, null, null, true, null, out createStatus);

        if (createStatus == MembershipCreateStatus.Success)
        {
            FormsAuthentication.SetAuthCookie(model.UserName, false /* createPersistentCookie */);
           //Get UserId for registered user
            var UserId = (Guid)Membership.GetUser(model.UserName).ProviderUserKey;
            ExtendedUser extrainfo = new ExtendedUser();
            extrainfo.UserId = UserId;
            extrainfo.FirstName= model.FirstName;
            extrainfo.LastName= model.LastName;
            //Add this info to database
            db.ExtendedUsers.Add(extrainfo);
            db.SaveChanges();
            return RedirectToAction("Index", "Home");
        }
        else
        {
            ModelState.AddModelError("", ErrorCodeToString(createStatus));
        }
    }

    // If we got this far, something failed, redisplay form
    return View(model);
}

Offcourse,您需要添加从DbContext类继承的类的新表 如下:

 public class YourContext: DbContext
    {
        public DbSet<ExtendedUser> ExtendedUsers{ get; set; }
    }

hussh ......你已经完成了。

修改:

微软在How to: Implement a Custom Membership User以不同的方式做到了这一点,但他们在那里缺少了一些东西。但是你可以看看它。

答案 1 :(得分:0)

老实说,我不会使用默认的Membership工具,因为数据库模式几乎完全由BLOB字段组成,默认提供程序假设您要使用其嵌入式ADO逻辑。既然你提到了Code First,我假设你是(或者想要)使用Entity Framework。编写可以利用EF(或任何其他数据访问工具)的自定义Membership提供程序并不是非常困难。

如果您需要指导,可以在此处找到我用于个人网站的MembershipRole提供商的实施:https://github.com/tiesont/Monkey.CMS/tree/master/Monkey.Web/Core/Providers - 是的,自定义提供商过度,因为你可以通过我的实现看到大多数抽象基类方法不需要实现来获得有效的提供者。