首页 > 解决方案 > 基于另一个具有属性的属性的 ASP.NET Core 检查验证

问题描述

我的问题是我有一个名为 DocumentType 的模型

Type 1 - pdf only
Type 2 - excel only

用户必须选择要上传的类型和文件。

现在我想做一些自定义验证来检查与文件类型关联的扩展名,但我似乎无法访问 Document 中的 DocumentType 属性

public class Document
{
    public int Id { get; set; }

    [Required]
    [StringLength(100)]
    [MaxLength(100)]
    public string FileName { get; set; }

    public byte[] FileBytes { get; set; }

    [Required]
    [StringLength(65)]
    [MaxLength(65)]
    public string ContentType { get; set; }

    [StringLength(100)]
    [MaxLength(100)]
    [Display(Name = "Observações")]
    public string Observacoes { get; set; }

    [Required]
    [Display(Name = "Tipo Documento")]
    public int DocumentTypeId { get; set; }
    public DocumentType DocumentType { get; set; }

    public int ArtigoId { get; set; }
    public Artigo Artigo { get; set; }
}    

在我的页面上我有这些属性

[BindProperty]
public Document Document { get; set; }  
[Required]
[BindProperty]
[MaxFileSize(3 * 1024 * 1024)]
[CheckExtension]
public IFormFile File { get; set; }

这是验证属性,我将在其中检查扩展

public class CheckExtension : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var file = value as IFormFile;
        var extension = Path.GetExtension(file.FileName);

       // TODO

        return ValidationResult.Success;
    }

}

标签: c#validationasp.net-core

解决方案


最简单的解决方案是添加IFormFIle属性 doDocument并将验证属性应用于类

[CheckExtension]
public class Document
{
    public IFormFile FormFile { get; set; }

    public DocumentTypo DocumentType { get; set; }

    //...
}

并将属性的代码更改为

public class CheckExtension : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var document = value as Document;
        var extension = Path.GetExtension(document.FormFile.FileName);
        // TODO

        return ValidationResult.Success;
    }
}

如果您不能或不想修改Document类,您可以创建一个包装类,而不是保存一个文档和一个文件

[CheckExtension]
public class DocumentWrapper
{
    public Document Document { get; set; }

    public IFormFile FormFile { get; set; }
}

并更新属性

public class CheckExtension : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var document = value as DocumentWrapper;
        var extension = Path.GetExtension(document.FormFile.FileName);
        // TODO

        return ValidationResult.Success;
    }

}

推荐阅读