Validation ASP.NET Core中的视图模型和Fluent验证

Validation ASP.NET Core中的视图模型和Fluent验证,validation,asp.net-core,data-annotations,fluentvalidation,Validation,Asp.net Core,Data Annotations,Fluentvalidation,如何在ASP.NET核心中验证从视图传递到API控制器的模型。是否有一种类似工具或任何类似的方法可以自定义以将错误和消息返回到客户端应用程序?您可以使用IValidatableObject界面。然后创建一个抽象基类,并让您的类从中继承。您需要添加对System.ComponentModel.DataAnnotations的引用。您还可以将助手方法添加到基类中 [HttpPost] public ActionResult Register(RegisterViewModel mod

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

您可以使用IValidatableObject界面。然后创建一个抽象基类,并让您的类从中继承。您需要添加对System.ComponentModel.DataAnnotations的引用。您还可以将助手方法添加到基类中

   [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);
        }



    }
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
}
公共抽象类ValidatingBase:IValidatableObject
{
公共bool IsNullOrEmpty(字符串属性)
{
返回字符串.IsNullOrEmpty(属性);
}
#区域表对象
公共抽象IEnumerable Validate(ValidationContext ValidationContext);
公共IEnumerable验证()
{
var validationErrors=新列表();
var ctx=新的ValidationContext(this,null,null);
TryValidateObject(this,ctx,validationErrors,true);
返回验证错误;
}
#endregion表对象
}
然后是从上面继承的类

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
}
public类插入公司:ValidatingBase
{
公共字符串CompanyName{get;set;}
#区域验证CommandBase
公共重写IEnumerable验证(ValidationContext ValidationContext)
{
if(this.IsNullOrEmpty(this.Name))
{
返回新的ValidationResult($“{nameof(this.Name)}字段不能为null或空。”,新[]{nameof(this.Name)});
}
如果(此.Name?.Length>100)
{
返回新的ValidationResult($“{nameof(this.Name)}字段不能超过100个字符。”,新[]{nameof(this.Name)});
}
}
#endregion ValidatingCommandBase
}
对于如何使用上述实现,没有太多限制。也许这对你来说是一个可行的选择

NETCore很乐意为您调用该方法,更多信息可以在下面的链接中找到。

谢谢Nasim,我已经知道了。我正在寻找一种更为动态和定制的方法,使用nugget库或更好的方法来实现这一点。看起来FluentValidation可用于.NET Core?有一个例子。