2012-10-22 34 views
4

我已經開始學習MVC3開發,並且遇到了一些絆腳石。在我的項目中,我已將默認的aspnet_ membership表移動到單獨的SQL Server 2008 Express數據庫中。然後我添加了我自己的表格來存放額外的配置文件數據我想現在建立一個視圖,它將列出用戶名(來自aspnet_Users),電子郵件地址(來自aspnet_Membership),名字和姓氏(從用戶ID作爲PK和FK到aspnet_Users的自定義表UserDetails)以及用戶角色aspnet_UsersInRoles和aspnet_Roles)。MVC3默認成員屬性在視圖中使用自定義模型屬性(使用ModelView?)

到目前爲止讀取和我的數據庫寫我已經建立了模型,我的每一個定製的表用的DbContext類:

public class UserDetail 
{ 

    [Key] 
    public Guid UserId { get; set; } 

    public string FirstName { get; set; } 

    public string LastName { get; set; } 

    public string Address { get; set; } 

    public string City { get; set; } 

    public string State { get; set; } 

    public string Zip { get; set; } 

    public string Phone { get; set; } 

    public DateTime DateUpdated { get; set; } 
} 

public class UserLinkToken 
{ 
    [Key] 
    public Guid UserId { get; set; } 

    public string LinkToken { get; set; } 

    public DateTime DateUpdated { get; set; } 
} 

public class ProShotDB : DbContext 
{ 
    public DbSet<UserDetail> UserDetails { get; set; } 
    public DbSet<UserLinkToken> UserLinkTokens { get; set; } 
} 

我不得不說出我的表「的UserDetails」和「 UserLinkTokens「爲我的應用程序編寫和更新我的數據庫,當模型和dbcontext的名稱與我的數據庫和表名稱不匹配時,應用程序最終將創建另一個帶有表的數據庫並在其中寫入數據。

從我可以告訴發送一個對象來查看來自我的自定義表的屬性從aspnet_表和屬性我將要建立一個ModelView。在閱讀了很多modelview示例後,我仍然不清楚它應該如何查找我的應用程序。

有人可以給我一個模型視圖的例子,我可以用它來顯示數據行的列表,並更新模型視圖中引用的所有相應的表列給定的用戶ID?

對於這個例子可以說我只想要一個所有FirstNames(UserDetails表)及其相應的電子郵件(aspnet_Membership)的視圖。

我的最終目標是顯示用戶與他們分配的角色的視圖。列出的每個用戶都將擁有一個鏈接,該鏈接將導向一個控制器,如果他們當前不是該角色,則該控制器會將其分配爲管理員,如果他們當前是管理員,則將其刪除。

對不起,如果這種類型的問題已在其他問題之前回答。我已經閱讀了其中的很多內容,覺得他們可能應該回答我的問題,但沒有一個看起來很匹配。很可能我的困惑源於不完全理解我的應用如何與我的數據庫建立連接。我理解我的模型表示一行表的數據,而dbcontext接收一組這些數據行模型並將它連接到數據庫中的表(dbset <(datarow/model object)>(數據行/一組模型對象))。由於我沒有看到aspnet_ tables/model對象的dbcontext類,所以我沒有一個關於如何檢索,更新或寫入這些表中的數據的好概念。

感謝您的任何幫助清理我的無知如何工作或給我一個簡單的例子,如何完成我所需要的。

+0

+1爲新的,但詳細闡述真正歡迎您的問題。也對答案感興趣。 – Silvermind

+1

不要在成員表和表之間創建任何外鍵。這會在使用會員系統的管理功能時造成問題。成員不期望有任何外鍵參考違規,並會拋出異常。 –

+0

嗯,我按照以下說明執行此操作:http://www.asp.net/web-forms/tutorials/security/membership/storing-additional-user-information-cs 很高興知道這可能會對我造成問題。 –

回答

1

首先,它被稱爲視圖模型,而不是模型視圖。視圖模型只是一個爲視圖而定製的類。它通常只包含該視圖所需的數據,幷包含諸如處理驗證和演示的數據註釋之類的內容。

因此,您只需創建一個模型,其中包含要顯示在視圖中的所有數據。這就是構建視圖模型的全部內容。

所以,你的視圖模型,簡直是

public class MyViewModel { 
    public string FirstName {get;set;} 
    public string Email {get;set;}   
} 

那麼在你看來,你只是做這樣的事情:

@model MyViewModel 

@using(Html.BeginForm()) { 
    @Html.EditorForModel() 
    <input type="submit" /> 
} 

在您的控制器(或更好,但在業務層)您只需執行查詢即可檢索用戶名稱和電子郵件,然後將查詢結果中的值複製到視圖模型中。

當您更新數據時會做相反的處理。這是一個非常大的概念,儘管在這樣的帖子中討論。你應該看看示例代碼,比如MVC Music Store或者Nerd Dinner。

重要的是要記住。成員資格是與其他表格完全分離的系統。您必須單獨檢索它們,並分別更新它們。使用Membership API更新成員電子郵件或其他詳細信息,並使用自己的表更新數據。

+0

哎呀,我知道這是ViewModel,我用它在十幾個谷歌搜索。感謝您的更正。很高興知道將Membership表格與其他表格完全分開,這可能會爲我節省一些時間。我猜如果我需要,我可以推出我自己的自定義會員提供商或從github下載預建的一個。 –

0

好吧,我決定我真的需要這個功能是在成員身份,所以我放棄了試圖包括姓和名。

我的視圖模型:

namespace Pro_Shot_Portal.ViewModels 
{ 
    public class SetAdminViewModel 
    { 
     public string UserName { get; set; } 
     public string Email { get; set; } 
     public string[] Role { get; set; } 
    } 
} 

我的控制器:

[Authorize(Roles = "Administrator")] 
    public ActionResult SetRoles() 
    { 

     var model = Membership 
      .GetAllUsers() 
      .Cast<MembershipUser>() 
      .Select(x => new SetAdminViewModel 
       { 
        UserName = x.UserName, 
        Email = x.Email, 
        Role = Roles.GetRolesForUser(x.UserName) 
       }); 
     return View(model); 
    } 

    [Authorize(Roles = "Administrator")] 
    public ActionResult AddAdmin(string username) 
    { 
     Roles.AddUserToRole(username, "Administrator"); 

     return RedirectToAction("SetRoles", "Account"); 
    } 

    [Authorize(Roles = "Administrator")] 
    public ActionResult RemoveAdmin(string username) 
    { 
     Roles.RemoveUserFromRole(username, "Administrator"); 

     return RedirectToAction("SetRoles", "Account"); 
    } 

筆者認爲:

@model IEnumerable<Pro_Shot_Portal.ViewModels.SetAdminViewModel> 

@{ 
    ViewBag.Title = "Set Roles"; 
} 

<h2>Index</h2> 

<table> 
    <tr> 
    <td>UserName</td> 
    <td>Email</td> 
    <td>Roles</td> 
    </tr> 

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.UserName) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Email) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Role) 
     </td> 

     <td> 
      @if (@Html.DisplayFor(modelItem => item.Role).ToString() == "Administrator") 
      { 
       @Html.ActionLink("Remove Admin", "RemoveAdmin", new { username = item.UserName }) 
      } 
      else 
      { 
       @Html.ActionLink("Add Admin", "AddAdmin", new { username = item.UserName }) 
      } 
     </td> 
    </tr> 
} 

</table> 

這看起來WOR k現在爲我。

感謝您幫助我把正確的道路Mystere。另外請讓我知道如果任何東西看起來不對我的代碼。

相關問題