-1

我正在使用 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 的唯一方法是针对 Groups 存储库中已经存在的所有 Groups 验证新组名。因此,此验证必须在 GroupsRepository 中。我说得对吗?

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

4

1 回答 1

0

问题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
    }
于 2012-09-20T23:36:13.110 回答