如何解决验证表单数据对于 web api 中的空值
我有这样的课
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;
}
}
我想知道如何对表单数据输入强制执行空属性检查
我尝试了什么:
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"]
};
var isModelStateValid = ModelState.IsValid;
if(!isModelStateValid )
{
throw ArgumentException("Found Data Null");
}
return instance.someMethod();
}
catch (Exception ex)
{
return ex;
}
}
但是 ModelState.IsValid
始终为真,因为它包含 count = 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
(此链接适用于 .NET 5,但基本上相同的东西和想法也适用于旧的 MVC/WebApi)
或者,如果您仍然想使用您的代码,您可以简单地使用 Validator
类触发默认验证:
https://docs.microsoft.com/en-us/dotnet/api/system.componentmodel.dataannotations.validator?view=net-5.0
如果对象根据您定义的属性无效,则抛出异常。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。