1

第一次使用 ASP.NET MVC 3 并真正努力做应该非常简单的事情。

我正在使用内置的会员功能注册用户,但我也想存储他们的名字和姓氏,这不是默认提供的属性。

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

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

谁能指出我正确的方向?谢谢。

4

3 回答 3

0

这不是特定于 MVC 的答案,但 ASP.Net 成员资格提供程序是为简单的授权方案而设计的,并且不附加其他信息。根据有关此的 MSDN 文档:“会员资格还可以与用户配置文件属性集成,以提供可针对单个用户量身定制的特定于应用程序的定制。”

您需要创建一个包含 first 和 last name 属性的配置文件模式,可能是这样的:

<profile defaultProvider="AspNetSqlProfileProvider">
  <properties>
     <add name="FirstName" type="System.String" />
     <add name="LastName" type="System.String" />
  </properties>
</profile>

然后您可以从 HTTP 上下文 User 属性中引用他们的配置文件详细信息。

另请参阅演练:使用配置文件属性维护网站用户信息

祝你好运!

于 2013-03-10T07:40:17.353 回答
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;}
    }

在此之后,您需要使用Registerin 方法将这些详细信息放入数据库中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);
}

当然,您需要将这个新表添加到从类继承的DbContext类中,如下所示:

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

嘘……你就完了。

编辑 :

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

于 2013-03-10T05:04:05.530 回答
0

老实说,我不会使用默认Membership工具,因为数据库架构几乎完全由 BLOB 字段组成,并且默认提供程序假定您想要使用它们嵌入的 ADO 逻辑。既然您提到了 Code First,我假设您正在(或想要)使用实体框架。Membership编写一个可以利用 EF(或任何其他数据访问工具,就此而言)的自定义提供程序并不难。

如果您需要指导,您可以在此处找到我用于个人网站Membership和提供者的实现: https ://github.com/tiesont/Monkey.CMS/tree/master/Monkey.Web/Core/Providers - 和是的,自定义提供程序是多余的,因为您可以通过我的实现看到大多数抽象基类方法不需要实现即可获得工作提供程序。Role

于 2013-03-10T05:30:10.600 回答