繁体   English   中英

ASP.Net Core MVC - 仅在摘要中显示自定义验证错误

[英]ASP.Net Core MVC - Show custom validation error in summary only

我有一个自定义 ValidationAttribute 部分基于此 SO 答案将多个属性的组验证消息组合成一条消息 asp.net mvc

我只想在下面显示自定义错误

<div asp-validation-summary="All" class="text-danger"></div>

目前,它同时显示在字段和摘要中。

我的代码如下:

验证属性:

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

视图模型:

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

看法:

<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" />

结果是:

在此处输入图像描述

专门为自定义验证定义一个可为空的属性。

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" />

我改为实施 class 级别验证。

取自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="All" 字段中显示错误

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM