如何将关系数据添加到ASP.net MVC数据实体创建视图?

时间:2009-03-06 06:47:45

标签: asp.net-mvc entity-framework ado.net

假设我有一张工作人员表,以及一个多对多关系中的员工角色表(即两者之间的StaffMembersInRoles表)。使用ADO.net实体框架,我们有一个这样的对象模型: alt text http://martindoms.com/img/datamodel.png

我有一个带有create方法和Create视图的StaffController控制器,它几乎是标准的自动生成类型。我希望创建页面列出StaffRoles表中的角色,每个表旁边都有一个复选框,当按下提交按钮时,这些会被添加到新的StaffMember StaffRole IEnumable中(因此在StaffMembersInRoles表中输入相应的条目)。我如何用强烈的视角来解决这个问题?

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

嗨这个方法的问题是你没有真正传递给View的强类型实体。在此问题中,您需要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,你不会有一些回发。