2013-03-10 26 views
2

第一次使用ASP.NET MVC 3进行游戏,并且非常努力的去做非常简单的事情。在MVC 3中存储额外用户信息的简单方法?

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

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

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

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

+0

您使用默认的成员资格模式吗? – 2013-03-10 04:55:04

+0

我敢打赌,是的。我已经找到了处理标准.Net Membership的最好方法,就是直接扩展实际的用户表,或者用连接表/视图来扩展实际的用户表,并将其用于实体模型。从mvc4(技术上从WebMatrix的库)使用 – 2013-03-10 04:59:10

+1

simplemembershipprovider – 2013-03-10 05:13:47

回答

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

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

所以你Register方法,即用annoted [HttpPost]:这可以通过从Membership采取UserId,并把多余的细节在一个完全不同的表反对这种UserId在database。这表可以如下管理更改为以下内容以将数据存储在上表中。

[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这样做以不同的方式,但他们缺少在there.But东西,你可以看看它。

+0

嘿感谢,这看起来像我试图之前的做法,但有一些东西固定,希望能帮助我。我没有的一件事是提供SaveChanges()方法和东西的这个“db”变量,它来自哪里?谢谢。 – ARW 2013-03-10 21:11:03

+0

另外,这是认真获得用户ID的最佳方式吗? var UserId =(Guid)Membership.GetUser(model.UserName).ProviderUserKey;我不怀疑它,但是如果让一件令人恐怖的代码变得如此简单,那该怎么办?我来自PHP MVC框架,这种事情是如此微不足道,所以这一直是一个相当令人痛苦的练习... – ARW 2013-03-10 21:30:33

+0

@AW。那'db'只不过是上下文的名字。在做这件事之前,你必须通过详细的框架细节。是的,我已经使用链接来获得像jQuery一样的'userid',你可以将它简化。 – 2013-03-11 04:51:20

0

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

如果你需要的方向,你可以找到我用我的两个个人网站的MembershipRole供应商在这里实现:https://github.com/tiesont/Monkey.CMS/tree/master/Monkey.Web/Core/Providers - 是的,定制的提供者是矫枉过正,因为你可以通过我的实现中可以看到,大部分的抽象基类方法不需要实现以获得工作提供者。

0

这不是MVC特定的答案,但ASP.Net成员资格提供程序专为简单的授权方案而设计,不附加其他信息。 Per the MSDN docs on this:“会员还可以与用户配置文件属性提供领域的应用需求,可以针对个别用户的整合。”

你要create a profile schema that contains properties for the first and last name,也许是这样的:

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

,然后你可以参考他们的个人资料的细节from the HTTP context User property

另见Walkthrough: Maintaining Web Site User Information with Profile Properties

祝你好运!

相关问题