0

不确定我是否完全遗漏了一些东西,但是,我有一个使用 EF 和基于角色的身份验证的典型 MVC Web 应用程序,例如:

public class User
{
    public int UserId { get; set; }
    public string Name { get; set; }
    public IList<Role> UserRoles { get; set; }
}

public class Role
{
    public int RoleId { get; set; }
    public string Name { get; set; }
    public IList<User> RoleUsers { get; set; }
}

理想情况下,在上述情况下,我想要一个编辑屏幕来更新用户名,该用户名还允许对用户角色进行添加/删除操作,例如,带有名称输入字段的表单,每个用户角色的表行有一个删除按钮,一个角色下拉列表有一个添加按钮。

在发出保存请求之前,如何在不将角色添加/删除持久化到数据库的情况下对视图模型(用户)执行编辑?

最好考虑添加操作。如果插入一个新用户,如何在不先插入用户的情况下构建该用户角色的集合?

提前致谢。

4

1 回答 1

0

在对此进行了更多研究之后,Phil Haacked 写了一篇关于将视图模型绑定到列表的文章,可在此处找到...

http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

我可能已经使用这种方法来创建一个表单,其中包含实体属性的输入和使用上述子对象方法绑定的关联输入集合。虽然我想这可能需要父实体上的每个导航属性的重复列表属性,这对我来说是一个打击。

如果添加具有复杂对象集合的实体,此方法也无法解决您如何在同一视图上优雅地输入复杂对象的所有属性(因为父实体仅存在于内存中) - 最简单的方法可能是包含编辑表单的部分视图?

为简单起见,我选择将编辑视图更改为仅编辑实体的基本属性,并为重定向到相关控制器的子对象提供单独的链接,使用用户示例,添加操作将如下所示:

  • 用户/编辑/{user_id} 视图 -> 输入用户名、电子邮件等。
  • 单击保存 -> 重定向到用户/索引或用户/详细信息/{user_id}
  • 单击后,此用户可以使用“管理角色”链接 -> 重定向到 /Role/Index/{user_id}
  • 页面显示此用户的角色表,能够添加/编辑等。

编辑:

另外,以防万一这对其他人有帮助。

我将/Role/Index操作设置为默认列出所有角色,但它也接受 UserId 参数 ( /Role/Index/{user_id})。当指定 UserId 时,该操作会返回一个不同的视图 ( /Role/IndexForUser),其数据模型是User实体 - 它与默认Index视图相同,但仅列出与用户关联的角色,并显示更多上下文链接,例如“将用户从角色'。

于 2012-07-27T09:08:34.227 回答