模式在控制器中进行多对多的模型创建

时间:2012-09-20 22:03:28

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

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

  1. 我有User模型和Group模型。用户可以拥有多个组,一个组可以拥有多个用户。因此,这是一种多对多的关系。
  2. 我有一个UserController和一个GroupController。
  3. 用户可以创建新组。
  4. 我有如存储库模式中所述的UsersRepository和GroupsRepository。
  5. GroupController有一个Create(Group newGroup)动作。
  6. 用户不得超过10个组。
  7. 组名必须是唯一的。
  8. 问题1:要处理限制6,我必须在类User上实现IValidatableObject,如果用户有超过10个组,则生成验证错误。但是,由于GroupController的Create操作仅接收Group作为参数,因此模型绑定器将永远不会调用User.Validate()。

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

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

1 个答案:

答案 0 :(得分:0)

问题1:

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

USER REPOSITORY


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
    }