2009-03-06 81 views
2

比方說,我有一張工作人員表,以及一個單獨的工作人員角色表,表示多對多關係(即兩個表之間有一個StaffMembersInRoles表)。使用ADO.net實體框架,我們有這樣一個對象模型: alt text http://martindoms.com/img/datamodel.png如何將關係數據添加到ASP.net MVC數據實體創建視圖?

我有一個StaffController控制器有一個create方法和一個Create視圖,它幾乎是標準的自動生成類型。我希望創建頁面在每個旁邊的複選框中列出StaffRoles表中的角色,並且當提交按鈕被按下時,這些被添加到新的StaffMember StaffRole IEnumable(並且因此適當的條目在StaffMembersInRoles表中進行)。我如何用強烈的觀點去解決這個問題?

回答

1

嗨這個方法的問題是你真的沒有一個強類型實體傳遞給視圖。在這個問題中,您需要StaffMember信息和所有StaffRole實體的列表。 PS:我真的很喜歡在視圖中投射列表的方法:StaffRole [])ViewData [「AllRoles」]

基本上我更喜歡使用DTO。

DTO:

public StaffMemberDto 
{ 
    public int StaffMemberId { get; set; } 
    public IList<StaffRoleDto> AllStaffRoles { get; set;} 
    public IList<StaffRoleDto> MembersRolesAttached { get; set;} 
} 

public StaffRoleDto 
{ 
    public int RoleId {get; set;} 
    public string RoleName { get; set; } 
} 

控制器:

return View(StaffMemberDto); 

所以在視圖中你會得到強類型的所有角色:

foreach (var role in ViewDate.Model.AllStaffRoles) 
{ 
    ... 
} 

與後你可以發送StaffMemberDto在視圖中已經分配好的RoleDto,或者您可以執行請求技巧以獲取勾選的複選框的ID。

那麼在這樣的視圖中,我可能會使用jquery在每次有人打勾添加角色時請求addRole。它會添加一些Ajax到你的表單,你不會有一些回發。

+0

這很完美,非常感謝。我永遠不會想到這一點。只是一個簡短的供參考,你可能想編輯你的文章來定義DTO(我不得不穀歌它)爲了後代的緣故。 – 2009-03-13 02:53:09

4

這是我該怎麼做:

首先,你需要一個所有可能的角色數組。 在控制器中,我會做這樣的事情(我做你的DAO一些假設):

ViewData["AllRoles"] = (StaffRole[])StaffRole.FindAll(); 

那麼在您看來,通過角色循環:

<% foreach (StaffRole Role in (StaffRole[])ViewData["AllRoles"]) { %> 

<p> 
    <label> 
    <%= Html.CheckBox("Role_"+Role.RoleId.ToString()) %> 
    <%= Html.Encode(Role.RoleName) %> 
    </label> 
</p> 

<% } %> 

然後在你的POST控制器,做這樣的事情:

foreach (StaffRole Role in (StaffRole[])StaffRole.FindAll()) 
{ 
    if (Request.Params["Role_"+Role.RoleId.ToString()]=="true") 
    MyStaff.Roles.Add(Role); 
} 
+0

謝謝!通常我會在這裏發佈的答案上得到尖銳的反饋......很高興聽到。 – Chris 2009-03-11 23:03:01

相關問題