模型验证——为什么是ModelState.IsValid总是返回true,即使没有提供任何值
本文关键字:任何值 返回 为什么 验证 ModelState IsValid 模型 true | 更新日期: 2023-09-27 18:08:59
这是关于WEBAPI
和以下是我的模型类。
public class Request
{
public int Id { get; set; }
public string Name { get; set; }
[Required]
public Gender Gender { get; set; }
}
控制器函数(POST)
public class Values1Controller : ApiController
{
public IHttpActionResult Post([FromBody] Models.Request request)
{
if (!ModelState.IsValid)
{
return BadRequest();
}
var gender = request.Gender;
var id = request.Id;
var name = request.Name;
// do some operations!
return Ok();
}
}
和我随每个请求一起提交的xml。
<Request xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://schemas.datacontract.org/2004/07/webapi1.Models">
<id>1</id>
<name>testName</name>
</Request>
在上面的XML post数据中,我根本没有提供Gender
的值,它被标记为[required]
。
但是ModelState.IsValid
返回true,即使在上面的XML中没有值Gender
.
如何防止WebAPI在模型中分配默认值给枚举?
我不知道为什么你的模型是有效的,如果你不提供性别,但你可以使这个值没有一个默认值,通过定义性别值为空,如下:
public class Request
{
public int id { get; set; }
public string Name { get; set; }
[Required]
public Gender? Gender { get; set; }
}
也可以为性别指定一个默认值,如下所示:
public enum Gender
{
Unknown = 0,
Male,
Female
}
现在我可以看到我们的结果之间的差异,再次使用Postman,如果我以xml形式提交一个原始请求:
Header: Content-Type text/xml
<Request xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://schemas.datacontract.org/2004/07/webapi1.Models">
<id>1</id>
<Name>testName</Name>
</Request>
我的模型是有效的,但是如果我提交x-www-form-urlencoded数据:
Header: Content-Type application/x-www-form-urlencoded
id=1,Name=testname
那么我的模型是无效的,即使值类型有一个值,我的modelstate告诉我需要Gender属性。
由于x-www-form-urlencoded是查询字符串的一部分,那么我猜MVC能够确定该值缺失,但是当数据作为纯xml提交时,它无法确定这一点。
我建议,如果您希望所需的属性在所有情况下都能工作,您可以使您的值类型为空,如下所示:
[Required]
public Gender? Gender { get; set; }
您刚刚输入了Required
验证,但是您没有像这样检查值:
[RegularExpression("^[0-9]*$", ErrorMessage = "Your fill the wrong content!")]
,如果你想在保存前设置默认值,你可以在你的类中这样做:
public Request()
{
Gender = "male";
Name = "default name"
}
希望能帮到你!