簡體   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