【问题标题】:Pattern to make many to many model creation in a controller在控制器中创建多对多模型的模式
【发布时间】:2012-09-20 22:03:28
【问题描述】:

我正在使用 asp.net mvc 3。我有这样的场景:

  1. 我有用户模型和组模型。一个用户可以有很多组,一个组可以有很多用户。因此,它是多对多关系。
  2. 我有一个 UserController 和一个 GroupController。
  3. 用户可以创建新组。
  4. 我有存储库模式中描述的 UsersRepository 和 GroupsRepository。
  5. GroupController 有一个 Create(Group newGroup) 操作。
  6. 一个用户的组不能超过 10 个。
  7. 组名必须是唯一的。

问题 1:要处理限制 6,我必须在类 User 上实现 IValidatableObject 并在 User 拥有超过 10 个组时生成验证错误。但是,由于 GroupController 的 Create 动作只接收 Group 作为参数,模型绑定器永远不会调用 User.Validate()。

问题 2:处理限制 7 的唯一方法是根据组存储库中已存在的所有组验证新组名称。因此,此验证必须在 GroupsRepository 中。我说的对吗?

毕竟,我觉得我做错了什么。我的问题是:在我的场景中,实现现有用户创建新组的最佳方法是什么?我应该创建一个像 UserGrougViewModel 这样的视图模型并将其传递给 GroupController 的 Create 操作吗?或者我应该保持 Create(Group newGroup) 操作不变,并在 UserController 上添加一个 CreateGroup(User user) 操作以根据规则 6 验证用户,然后重定向到 GroupController 的操作 Create(Group newGroup)?

【问题讨论】:

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


    【解决方案1】:

    问题 1:

    不确定是否实现 IValidatableObject,但您可以在用户存储库中创建一个方法,该方法将返回用户所在组的数量。并且,从 GroupController 的 create 方法调用此函数。像这样:

    用户存储库


    public int GetNumberOfGroupsByUserId(int userId)
    {
       return context.Users.SingleOrDefault(u=>u.Id==userId).Groups.Count;
    }
    

    在创建新组时从 GroupController 使用

        UserRepository userRepo= new UserRepository();
        if(userRepo.GetNumberOfGroupsByUserId(id)>10)
        {
          //write code to send error message to view saying the user already has more than 10 groups
        }
    else
    {
     //go ahead and create new group
    }
    

    问题 2:

    处理限制 7 的唯一方法是针对组存储库中已存在的所有组验证新组名称。因此,此验证必须在 GroupsRepository 中。我说的对吗?

    不,验证仍然可以在您的 GroupController(或您的业务层)中进行。就像在您的问题 1 中一样,您可以在 GroupRepository 中创建一个方法,如果数据库中已经存在组名,则返回 true,否则返回 false。该方法在 GroupRepository 中看起来像这样

    public bool NameExists(string groupName)
    {
     int count=0;
    count= context.Groups.Where(g=>g.Name==groupName).Count;
    if (count==0)
    return false;
    else
    return true;
    }
    

    在创建新组时从 GroupController 使用

            GroupRepository groupRepo= new GroupRepository();
            if(groupRepo.NameExists(groupName))
            {
              //write code to send error message to view saying a group already exists with same name
            }
        else
        {
         //go ahead and create new group
        }
    

    【讨论】:

    • 这是一个很好的解决方案,但我个人不喜欢在控制器操作内部进行验证。此外,请注意,创建新组需要通过将新组添加到用户的组列表来修改用户模型。所以组控制器的create动作是修改用户,不好..
    • 这只是一个示例,展示了如何在存储库之外进行验证。您可以在业务层中进行验证。我不认为存储库是验证的好地方。我的示例代码根本不修改用户对象。当您说“因此,组控制器的创建操作正在修改用户,这不好..”时,您是什么意思?
    • 你称之为业务层吗?正如我所写,这是多对多的关系。一个用户有很多组。因此,当用户创建组时,我需要将此创建的组添加到用户的组列表中,以便将创建的组固定到用户。这就是整个问题...我不知道实现现有用户创建组的最佳方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    相关资源
    最近更新 更多