ASP. Net Core MVC - Показать пользовательскую ошибку проверки только в сводке - PullRequest
0 голосов
/ 04 мая

У меня есть собственный атрибут 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" />

И результат:

enter image description here

Ответы [ 2 ]

0 голосов
/ 05 мая

Вместо этого я реализовал проверку на уровне класса.

Взято из https://docs.microsoft.com/en-us/aspnet/core/mvc/models/validation?view=aspnetcore-3.1

public class GroupValidationExampleViewModel : IValidatableObject
{
    private const int _total = 18;

    [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; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if ((ValueOne + ValueTwo + ValueThree + ValueFour + ValueFive) != _total)
        {
            yield return new ValidationResult("group total error model only");
        }
    }
}

Это отображает ошибку в asp -validation-summary = " Только все поля

0 голосов
/ 05 мая

Определите пустое свойство специально для пользовательской проверки.

public class GroupValidationExampleViewModel
{
    [GroupTotal(5, "ValueOne", "ValueTwo", "ValueThree", "ValueFour", "ValueFive")]
    public int? Sum { get; set; }

    [Required]
    [Range(0, 5)]
    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; }
}

Используйте asp -validation-for = "Sum", чтобы показать сообщение проверки вашей пользовательской проверки

<div class="form-group">
    <div class="col-sm-12">
        <span asp-validation-for="Sum" class="text-danger"></span>
    </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" />
...