假设我有一张工作人员表,以及一个多对多关系中的员工角色表(即两者之间的StaffMembersInRoles表)。使用ADO.net实体框架,我们有一个这样的对象模型: alt text http://martindoms.com/img/datamodel.png
我有一个带有create方法和Create视图的StaffController控制器,它几乎是标准的自动生成类型。我希望创建页面列出StaffRoles表中的角色,每个表旁边都有一个复选框,当按下提交按钮时,这些会被添加到新的StaffMember StaffRole IEnumable中(因此在StaffMembersInRoles表中输入相应的条目)。我如何用强烈的视角来解决这个问题?
答案 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,你不会有一些回发。