首页 > 解决方案 > 基于枚举的验证

问题描述

我有一个应该验证的模型。

public class VersandModalInput
{
    public Courier Courier { get; set; } = Courier.UPS;
    public List<PaketInput> Pakete { get; set; } = new List<PaketInput>();
    public int AnzahlPakete { get; private set; } = 0;
    public bool MailSenden { get; set; } = true;

    public void AddPaket(decimal gewicht = 0)
    {
        Pakete.Add(new PaketInput { Paketnummer = ++AnzahlPakete, Gewicht = gewicht });
    }

    public void RemovePaket()
    {
        Pakete.RemoveAt(--AnzahlPakete);
    }

    public void RemovePaket()
    {
        Pakete.RemoveAt(--AnzahlPakete);
    }
}

我的模型作为列表。这是课程:

public class PaketInput
{
    public int Paketnummer { get; set; }
    [Required]
    [Range(0.1, 31)]
    public decimal Gewicht { get; set; }
    public string Trackingnummer { get; set; } = ""; // This should be required is Courier of VersandModalInput is Manual
    public string MbeTrackingnummer { get; set; } = "";
}

如果 VersandModalInput 的 Courier 是 Manual 并且 List pakete 的任何跟踪编号为空,我想让 VersandModalInput 无效。包显示在前端,错误应该在特定字段下可见。这是我的 pakete 用户界面:

<table class="table table-responsive-xs">
<thead>
    <tr>
        <th>Paket</th>
        <th>Gewicht (Kg)</th>
        @if (BelegVersandInput.Versandtyp == Versandtyp.Manuell)
        {
            <th>Trackingnummer</th>
        }
    </tr>
</thead>
<tbody>
    @foreach (var paket in BelegVersandInput.Pakete)
    {
        <tr>
            <td>@paket.Paketnummer</td>
            <td>
                <InputNumber @bind-Value="paket.Gewicht" class="form-control" />
                <ValidationMessage For="() => paket.Gewicht" />
            </td>
            @if (BelegVersandInput.Versandtyp == Versandtyp.Manuell)
            {
                <td>
                    <InputText @bind-Value="paket.Trackingnummer" class="form-control" />
                    <ValidationMessage For="() => paket.Trackingnummer" />
                </td>
            }
        </tr>
    }
</tbody>

有没有办法用上面指定的类重新进行这种验证?

标签: c#validationasp.net-coreblazor-server-side

解决方案


您可以使用 FluentValidation:

install-package FluentValidation

然后试试这个:

public sealed class BelegVersandInput : Lagerregal.VersandModalInput
{
    public BelegTyp BelegTyp { get; set; }
    public int Belegnummer { get; set; }
    public Versandtyp Versandtyp { get; set; }

    public void Validate()
    {
            var validationResult = new BelegVersandInputValidator().Validate(this);
            if (!validationResult.IsValid)
                throw new Exception(string.Join(',', validationResult.Errors.Select(e => e.ErrorMessage)));
    }
}

public class BelegVersandInputValidator : AbstractValidator<BelegVersandInput>
{
    public BelegVersandInputValidator()
    {
        RuleFor(p=> p.Pakete).NotEmpty().When(p=> p.Versandtyp == Versandtyp.Manual)
    }
}

推荐阅读