c# - 基于枚举的验证
问题描述
我有一个应该验证的模型。
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>
有没有办法用上面指定的类重新进行这种验证?
解决方案
您可以使用 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)
}
}
推荐阅读
- r - tidyr pivot_longer:每行处理多个观察值和值
- python - Python 中 (\xa0) 和 () 的正则表达式).*()
- android - 如何在 AS 4.0 中使用 Retrofit 的挂起功能并启用 compose?
- r - R 中的 FactorMineR 包表示 R 3.6.1 不适用(R3.6.1“脚趾动作”/使用 RStudio 版本 1.2.5019/Ubuntu 18.04.3)
- c++ - Searching for string in the array and/or structure C++
- ios - SwiftUI Picker 选择绑定未更新
- azure - 生产 Web api 托管、容器的 Web 应用程序还是 azure 容器实例?
- python - `import pandas` 错误为 `ModuleNotFoundError: No module named 'pandas.msgpack'`
- batch-file - 如何在 cmd 中模拟“ENTER”键?
- vue.js - 如何在 Vuex 模块中使用 mapGetters