繁体   English   中英

Blazor 触发自定义验证消息

[英]Blazor trigger custom validation message

我有以下类,它被用作 Blazor 服务器端应用程序中 EditForm 的输入模型。

public class KundeInput
{
    [ValidateComplexType]
    public List<AnsprechpartnerInput> Ansprechpartner { get; } = new List<AnsprechpartnerInput>();
  
    public string? Kundennummer { get; }
 
    [Required]
    [MaxLength(60)]
    public string Firma { get; set; } = String.Empty;
    [MaxLength(60)]
    public string? Name2 { get; set; }
    [MaxLength(60)]
    public string? Name3 { get; set; }
}

如您所见,我的模型包含另一个名为 AnsprechpartnerInput 的模型列表。 这是这个模型:

public class AnsprechpartnerInput
{
    public string? Kundennummer { get; set; }
    public int Nummer { get; } = -1;
    [MaxLength(60)]
    [Required]
    public string Vorname { get; set; } = String.Empty;
    [MaxLength(60)]
    [Required]
    public string Nachname { get; set; } = String.Empty;
    [MaxLength(40)]
    [Required]
    public string? Bereich { get; set; }
    / * More properties */
}

验证工作正常。 但是,一旦我的列表中有多个无效的 AnsprechpartnerInput 模型,ValidationSummary 就会变得一团糟。 因为它显示例如 5 次字段 xyz 是无效的。

我知道我可以使用 ErrorMessage 属性设置自定义消息,但我无法在此消息中使用模型中的其他属性。

我想要实现的是:

[Required(ErrorMessage = $"Vorname of {Kundennummer} is required")]
public string Vorname { get; set; } = String.Empty;

我已经尝试通过反射更改消息,但不推荐或不支持 Microsoft 这种方式https://github.com/dotnet/aspnetcore/issues/25611

有没有办法让它工作? 我想到了字符串替换,但我不确定如何为我的 ValidationMessage 找出正确的模型。

还有什么方法可以通过一个来验证列表的项目并获得布尔结果? 假设我想实现这一目标:

@foreach (var ansprechpartner in Input.Ansprechpartner)
{

    if (Input.SelectedAnsprechpartner is null)
        Input.SelectedAnsprechpartner = ansprechpartner;

    <a @onclick="() => Input.SelectedAnsprechpartner = ansprechpartner"
       class="@GetNavListClass(Input.SelectedAnsprechpartner == ansprechpartner)"
       id="list-ansprechpartner-tab-@(ansprechpartner.Nummer)"
       data-toggle="list"
       href="#list-ansprechpartner-@(ansprechpartner.Nummer)"
       role="tab"
       aria-controls="@(ansprechpartner.Nummer)">
        @((MarkupString)(ansprechpartner.Nummer < 0  ? "<span class=\"font-weight-bold\">NEU</span>" : $"({ansprechpartner.Nummer})")) @ansprechpartner.Vorname @ansprechpartner.Nachname
    </a>
    // When the model ansprechpartner is invalid, I want to display an icon
}

谢谢你的帮助! PS:Blazor 摇滚!

您应该使用自定义验证属性,您可以在其中显式添加您想要的任何错误消息

public class KundennummerValidationAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var model = (AnsprechpartnerInput)validationContext.ObjectInstance;
        if(string.IsNullOrEmpty((string)value))
        {
            return new ValidationResult($"Vorname of {model.Kundennummer} is required", new[] { "Kundennummer" });
        }


        return ValidationResult.Success;
    }
}

然后使用

[KundennummerValidation]
public string Vorname { get; set; } = String.Empty;

结果:验证摘要:

在此处输入图片说明

暂无
暂无

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

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