为 Web 中的空值验证表单数据 api

Validating Form Data For null values in web api

我class喜欢

public class MyClass
{
  public object Jobj{get; set;}
  public string summary{get; set;}

 public string someMethod()
 {
  //Do some work
  return "";
 }
}

和一个 post 动作创建此 class 的实例并使用表单数据输入初始化属性

        [HttpPost]
        public dynamic controllerAction()
        {
            try
            {
                var instance= new MyClass
                {
                    Jobj= JObject.Parse(HttpContext.Current.Request.Params["formInputKey1"]),
                    summary= HttpContext.Current.Request.Params["summaryKey"]
                };
                return instance.SomeMethod();
            }
            catch (Exception ex)
            {
                return ex;
            }
        }

我想知道如何强制执行 null 属性 检查表单数据输入

我尝试了什么:

public class MyClass
{
  [Required]
  public object Jobj{get; set;}
  [Required(AllowEmptyStrings = false), StringLength(maximumLength: 100, MinimumLength = 1)]
  public string summary{get; set;}

 public string someMethod()
 {
  //Do some work
  return "";
 }
}

和一个 post 动作创建此 class 的实例并使用表单数据输入初始化属性

        [HttpPost]
        public dynamic controllerAction()
        {
            try
            {
                var instance= new MyClass
                {
                    Jobj= JObject.Parse(HttpContext.Current.Request.Params["formInputKey1"]),
                    summary= HttpContext.Current.Request.Params["summaryKey"]
                };
                var isModelStateValid = ModelState.IsValid;
                if(!isModelStateValid )
                {
                   throw ArgumentException("Found Data Null");
                }
                return instance.SomeMethod();
            }
            catch (Exception ex)
            {
                return ex;
            }
        }

ModelState.IsValid 始终为真,因为它包含计数 = 0

为了使用ModelState.IsValid,简单来说,应该使用对象作为方法的参数

public dynamic controllerAction(MyClass x)

ModelState.IsValid,同样,如果简单地说,是由 ModelBinder 填充的(基本上是“序列化”你的 Action 参数的东西),而不仅仅是 JObject.parse 或类似的东西.

然后如果你不能使用默认 ModelBinder 你可以自己写 - https://docs.microsoft.com/en-us/aspnet/core/mvc/advanced/custom-model-binding?view=aspnetcore-5.0 (这个 link 适用于 .NET 5,但基本上相同的事情和想法也适用于旧 MVC/WebApi)

或者,如果您仍想使用您的代码,您可以使用 Validator class 简单地触发默认验证: https://docs.microsoft.com/en-us/dotnet/api/system.componentmodel.dataannotations.validator?view=net-5.0

如果对象根据您定义的属性无效,则抛出异常。