Вы можете применить этот подход
http://byatool.com/mvc/custom-data-annotations-with-mvc-how-to-check-multiple-properties-at-one-time/
Чтобы включить свойство идентификатора в поиск, чтобы вы проверяли все «другие» UsergroupMetaData
с одинаковым именем группы пользователей.
Проверьте это и сообщите мне, если у вас возникли проблемы с его применением в вашем сценарии.
Редактировать: Дополнительные пояснения
Насколько я понимаю, вам нужно проверить, существуют ли другие объекты UsergroupMetaData с тем же именем группы пользователей.
Предположим, мы сделаем так, чтобы валидатор стал для всего вашего класса не свойством:
[UniqueUsergroupName]
public class UsergroupMetaData
Параметры не нужны. Давайте посмотрим, как будет выглядеть метод UniqueUsergroupName Validate ():
public override Boolean IsValid(Object value)
{
var usergroupName = value != null ? value.ToString() : null;
//We don't validate empty fields, the Required validator does that
if(string.IsNullOrEmpty(usergroupName)) return true;
Type objectType = value.GetType();
//Get the property info for the object passed in. This is the class the attribute is
// attached to
//I would suggest caching this part... at least the PropertyInfo[]
PropertyInfo[] neededProperties =
objectType.GetProperties();
var customerIdProperty = neededProperties
.Where(propertyInfo => propertyInfo.Name == "CustomerID")
.First();
var customerId = (int?) customerIdProperty.GetValue(value, null);
var usergroupNameProperty = neededProperties
.Where(propertyInfo => propertyInfo.Name == "UsergroupName")
.First();
var usergroupName = (string) customerIdProperty.GetValue(value, null);
// Now I don't userstand why the blog post author did all this reflection stuff to
// get the values of the properties. I don't know why he just didn't d something like:
// var usergroup = (Usergroup) value;
// var customerId = usergroup.CustomerId;
// var usergroupName = usergroup.UsergroupName;
//
//I think reflection was not needed here. Try both ways anyway.
// The next lines should not be different regardless of whether you used reflection.
//
//We don't validate empty fields, the Required validator does that
if(string.IsNullOrEmpty(usergroupName)) return true;
//Now you have the customerId and usergroupName. Use them to validate.
//If I'm using LINQ (for explanation only) it'd be something like:
// Assuming _rep.GetUsergroups() returns IQueryable (only for explanation):
int numberOfOtherUsergroupsWithSameName =
_rep.GetUsergroups()
.Where(g => g.UsergroupName == usergroupName && g.CustomerId != customerId)
.Count();
return numberOfOtherUsergroupsWithSameName == 0;
}