C# 在web api中验证表单数据是否为空值

C# 在web api中验证表单数据是否为空值,c#,asp.net-web-api,data-annotations,form-data,system.componentmodel,C#,Asp.net Web Api,Data Annotations,Form Data,System.componentmodel,我有一节课 public class MyClass { public object Jobj{get; set;} public string summary{get; set;} public string someMethod() { //Do some work return ""; } } 以及一个操作后创建该类的实例,并使用表单数据输入初始化属性 [HttpPost] public dynamic cont

我有一节课

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

 public string someMethod()
 {
  //Do some work
  return "";
 }
}
以及一个操作后创建该类的实例,并使用表单数据输入初始化属性

        [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;
            }
        }
        [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;
            }
        }
我想知道如何对表单数据输入强制执行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 "";
 }
}
以及一个操作后创建该类的实例,并使用表单数据输入初始化属性

        [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;
            }
        }
        [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
始终为true,因为它包含count=0

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

public dynamic controllerAction(MyClass x)
ModelState.IsValid
,简单地说,也是由
ModelBinder
(基本上是一个“序列化”动作参数的东西)填充的,而不仅仅是由
JObject.parse
或类似的东西填充的

然后,如果您不能使用默认的
ModelBinder
,您可以编写自己的- (此链接适用于.NET5,但基本上相同的东西和想法也适用于旧的MVC/WebApi)

或者,如果仍要使用代码,则可以使用
验证程序
类触发默认验证:


根据您定义的属性,如果对象无效,它将引发异常。

看起来像是模型绑定错误。您的操作方法必须采用类似于MyClass的controllerAction(MyClass MyClass)来检查您的模型状态,以确定它是否来自视图部件。您还可以共享视图部件代码?它没有视图部件代码。我们使用FormData来避免json数据中的脚本种类标记,所以我不能像controllerAction(MyClass MyClass)那样接受它