【问题标题】:Return error of model validation in result返回结果中模型验证的错误
【发布时间】:2020-07-01 07:54:42
【问题描述】:

我在 ASP.NET Core 3 中为类型文件创建验证。

这是我的模型验证:

public class MustbeImageFile : ValidationAttribute
{
    public string[] Extentions { get; set; }
    public string ErrorMessage { get; set; }

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

        if (file != null)
        {
            if (Extentions.Equals(extension))
            {
                return new ValidationResult(ErrorMessage);
            }
        }

        return ValidationResult.Success;
    }
}

我在一个属性上使用它:

[MustbeImageFile(ErrorMessage = "Must be Send Image File", Extentions = new string[] { "png", "jpeg", "jpg" })]
public IFormFile Photo { get; set; }

这是我的控制器:

public async Task<ApiReturn> RegisterUser([FromForm]RegisterDto register)
{
    if (ModelState.IsValid)
    {
        var result = await dispatchers.SendAsync(new CreateUserCommand()
                {
                    Email = register.Email,
                    UserName = register.UserName,
                    FirstName = register.FirstName,
                    LastName = register.LastName,
                    PhoneNumber = register.PhoneNumber
                });

        if (result.Success)
        {
            return Ok();
        }

        return BadRequest(result.ErrorMessage);
    }

    return BadRequest(ModelState);
}

我发送了一个 pdf 文件,我预计会收到此错误:

必须是图片文件

但我得到了这个错误:

Microsoft.AspNetCore.Mvc.ValidationProblemDetails

有什么问题?我怎样才能显示我的错误详细信息而不仅仅是Microsoft.AspNetCore.Mvc.ValidationProblemDetails

【问题讨论】:

  • ErrorMessage 继承自 ValidationAttribute。所以只需从 MustbeImageFile 类中删除 public string ErrorMessage { get; set; }

标签: c# asp.net asp.net-mvc asp.net-core


【解决方案1】:

MustbeImageFile 方法中,您编写了the opposite logic 以确定当前扩展是否包含在扩展中。

像这样更改 MustbeImageFile 方法:

//...       
if (!Extentions.Equals(extension))
{
    return new ValidationResult(ErrorMessage);
}
//...

【讨论】:

  • 您希望如何呈现错误消息?是不是像表单验证的错误信息一样出现在文件上传控件后面?如果是这样,您可以通过添加验证控件来显示错误消息。如果没有,建议您详细说明并提供您的前端代码供我们参考。
【解决方案2】:

可以定义执行管道应如何处理BadRequest 错误。例如,您可以编写自己的InvalidModelStateResponseFactory 来指定错误消息的格式。在您的情况下,您可以从自定义验证属性中读取错误消息。

看看我的回答in this post

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    • 2018-08-03
    相关资源
    最近更新 更多