Как добавить пользовательскую проверку к свойству коллекцииC#

Место общения программистов C#
Ответить
Anonymous
 Как добавить пользовательскую проверку к свойству коллекции

Сообщение Anonymous »

Я пытаюсь создать собственное свойство проверки, которое гарантирует наличие хотя бы одного выбранного свойства в коллекции сложных объектов. Проверка на стороне сервера работает нормально, но похоже, что метод AddValidation никогда не срабатывает, что подтверждается установкой точки останова для метода. Таким образом, атрибуты данных на стороне клиента никогда не обрабатываются для обеспечения проверки на стороне клиента.
Валидатор

Код: Выделить всё

 public class RequiredAtLeasOneFromCollectionAttribute : ValidationAttribute, IClientModelValidator
{
public RequiredAtLeasOneFromCollectionAttribute()
{
ErrorMessage = "Please select at least one"; //used if error message is not set on attribute itself
}

protected override ValidationResult IsValid(object value, ValidationContext context)
{
List  list = value as List;

if (list.IsNull() || !list.Any(x => x.IsSelected))
{
return new ValidationResult(ErrorMessage);
}

return ValidationResult.Success;
}

public void AddValidation(ClientModelValidationContext context)
{
MergeAttribute(context.Attributes, "data-val", "true");
var errorMessage = FormatErrorMessage(context.ModelMetadata.GetDisplayName());
MergeAttribute(context.Attributes, "data-val-requiredonefromcollection", errorMessage);
}

private bool MergeAttribute(IDictionary attributes, string key, string value)
{
if (attributes.ContainsKey(key))
{
return false;
}

attributes.Add(key, value);
return true;
}
}
Тип кампании

Код: Выделить всё

 public class CampaignType
{
[Required]
public int CampaignTypeId { get; set; }
[Required]
public string CampaignTypeName { get; set; }
[Required]
public bool IsActive { get; set; }
public bool IsSelected { get; set; } = true;
}
Потребитель

Код: Выделить всё

public class Affiliate
{
[Required]
public int Id { get; set; }

[RequiredAtLeasOneFromCollectionAttribute]
List Campaigns {get; set}

//Assume Constructor fills Campaigns
}
CSHTML

Код: Выделить всё

@for(int i = 0; i < Model.Affiliate.Campaigns.Count; i++)
{



@Model.Affiliate.Campaigns[i].CampaignTypeName 

}

Визуально список/флажки отображаются так, как и ожидалось, отсутствуют только атрибуты данных, которые нужно подключить к ненавязчивой проверке.

Подробнее здесь: https://stackoverflow.com/questions/790 ... n-property
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»