我正在使用asp.net mvc 3.我有这样的场景:
问题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)操作?
答案 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
}