2013-03-10 42 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

祝你好運!