У меня есть собственный атрибут ValidationAttribute, частично основанный на этом ответе SO. Группировать сообщения проверки для нескольких свойств в одно сообщение asp. net mvc
Я хотел бы показать пользовательскую ошибку только в следующем
<div asp-validation-summary="All" class="text-danger"></div>
В данный момент она отображается как в поле, так и в сводке.
Мой код выглядит следующим образом:
ValidationAttribute:
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public sealed class GroupTotalAttribute : ValidationAttribute//, IClientModelValidator
{
private string[] _serverSideProperties;
private int _total;
public GroupTotalAttribute(int total, params string[] serverSideProperties)
{
_serverSideProperties = serverSideProperties;
_total = total;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (_serverSideProperties == null || _serverSideProperties.Length < 1)
{
return null;
}
int sumOfInputs = 0;
foreach (var input in _serverSideProperties)
{
var propertyInfo = validationContext.ObjectType.GetProperty(input);
if (propertyInfo == null)
{
return new ValidationResult(string.Format("unknown property {0}", input));
}
var propertyValue = propertyInfo.GetValue(validationContext.ObjectInstance, null);
if (propertyValue is int)
{
sumOfInputs += int.Parse(propertyValue.ToString());
}
}
if (sumOfInputs == _total)
{
return null;
}
return new ValidationResult(string.Format("doesnt add up to {0}", _total));
//return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
}
}
ViewModel:
public class GroupValidationExampleViewModel
{
[Required]
[Range(0,5)]
[GroupTotal(5, "ValueOne", "ValueTwo", "ValueThree", "ValueFour", "ValueFive")]
public int ValueOne { get; set; }
[Required]
[Range(0, 5)]
public int ValueTwo { get; set; }
[Required]
[Range(0, 5)]
public int ValueThree { get; set; }
[Required]
[Range(0, 5)]
public int ValueFour { get; set; }
[Required]
[Range(0, 5)]
public int ValueFive { get; set; }
}
View:
<div class="form-group">
<div class="col-sm-12">
<div asp-validation-summary="All" class="text-danger"></div>
</div>
</div>
<div class="form-group">
<div class="col-sm-12">
<label asp-for="ValueOne" class="small mb-1">Value One</label>
<input asp-for="ValueOne" placeholder="" class="form-control">
<span asp-validation-for="ValueOne" class="text-danger"></span>
</div>
</div>
<div class="form-group">
<div class="col-sm-12">
<label asp-for="ValueTwo" class="small mb-1">Value Two</label>
<input asp-for="ValueTwo" placeholder="" class="form-control">
<span asp-validation-for="ValueTwo" class="text-danger"></span>
</div>
</div>
<div class="form-group">
<div class="col-sm-12">
<label asp-for="ValueThree" class="small mb-1">Value Three</label>
<input asp-for="ValueThree" placeholder="" class="form-control">
<span asp-validation-for="ValueThree" class="text-danger"></span>
</div>
</div>
<div class="form-group">
<div class="col-sm-12">
<label asp-for="ValueFour" class="small mb-1">Value Four</label>
<input asp-for="ValueFour" placeholder="" class="form-control">
<span asp-validation-for="ValueFour" class="text-danger"></span>
</div>
</div>
<div class="form-group">
<div class="col-sm-12">
<label asp-for="ValueFive" class="small mb-1">Value Five</label>
<input asp-for="ValueFive" placeholder="" class="form-control">
<span asp-validation-for="ValueFive" class="text-danger"></span>
</div>
</div>
<input type="submit" class="btn btn-primary" />
И результат: