【问题标题】:View models and Fluent Validation in ASP.NET Core在 ASP.NET Core 中查看模型和 Fluent 验证
【发布时间】:2016-11-09 18:33:34
【问题描述】:

我们如何在 ASP.NET Core 中验证从视图传递到 API 控制器的模型。是否有像 FluentValidation 这样的工具或任何类似的方法可以自定义以将我们的错误和消息返回给客户端应用程序?

【问题讨论】:

  • 看起来 FluentValidation 可用于 .NET Core?有一个例子here

标签: validation asp.net-core data-annotations fluentvalidation


【解决方案1】:

您使用了 IValidatableObject 接口。然后创建一个抽象基类,让你的类继承它。您将需要添加对 System.ComponentModel.DataAnnotations 的引用。您也可以向基类添加辅助方法。

public abstract class ValidatingBase : IValidatableObject
{
        public bool IsNullOrEmpty(string property)
        {
            return string.IsNullOrEmpty(property);
        }

            #region IValidatableObject

        public abstract IEnumerable<ValidationResult> Validate(ValidationContext validationContext);

        public IEnumerable<ValidationResult> Validate()
        {
            var validationErrors = new List<ValidationResult>();
            var ctx = new ValidationContext(this, null, null);
            Validator.TryValidateObject(this, ctx, validationErrors, true);
            return validationErrors;
        }

        #endregion IValidatableObject
}

然后你的类继承自上述

public class InsertCompanies : ValidatingBase
{
   public string CompanyName { get; set; }

   #region ValidatingCommandBase

        public override IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            if (this.IsNullOrEmpty(this.Name))
            {
                yield return new ValidationResult($"{nameof(this.Name)} field can't be null or empty.", new[] { nameof(this.Name) });
            }

            if (this.Name?.Length > 100)
            {
                yield return new ValidationResult($"{nameof(this.Name)} field can't be greater than 100 characters.", new[] { nameof(this.Name) });
            }
        }

        #endregion ValidatingCommandBase
}

对于您可以使用上述实现执行的操作没有太多限制。也许这对您来说是一个可行的选择?

Asp.Net Core 很乐意为您调用该方法,更多信息可以在下面的链接中找到。 https://docs.asp.net/en/latest/mvc/models/validation.html

【讨论】:

    【解决方案2】:
       [HttpPost]
    
        public ActionResult Register(RegisterViewModel model)
        {
      // if the validation doesn't match then load same view again with errors
            if (!ModelState.IsValid) 
            {
                return View(model);
            }
    
    
    
        }
    

    【讨论】:

    • 谢谢 Nasim,我已经知道了。我正在寻找一种更动态和定制的方法,使用块库或更好的方法来做到这一点。
    猜你喜欢
    • 2017-12-14
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    相关资源
    最近更新 更多