C# 模型验证-为什么ModelState.IsValid即使没有提供值也始终返回true?
这是关于C# 模型验证-为什么ModelState.IsValid即使没有提供值也始终返回true?,c#,.net,asp.net-web-api,asp.net-mvc-5,asp.net-web-api2,C#,.net,Asp.net Web Api,Asp.net Mvc 5,Asp.net Web Api2,这是关于WEBAPI和 下面是我的模型课 public class Request { public int Id { get; set; } public string Name { get; set; } [Required] public Gender Gender { get; set; } } 和我的控制器功能(POST) 以及我随每个请求一起提交的xml <Request xmlns:i=
WEBAPI
和
下面是我的模型课
public class Request
{
public int Id { get; set; }
public string Name { get; set; }
[Required]
public Gender Gender { get; set; }
}
和我的控制器功能(POST)
以及我随每个请求一起提交的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>
1.
测试名
在上面的XML post数据中,我根本没有为Gender
提供值,它被标记为[必需]
但是ModelState.IsValid
返回true,即使在上面的XML中没有值
为性别
提供
如何防止WebAPI向模型中的枚举分配默认值
你知道为什么吗?你只需要输入
必需的
验证,但你没有像这样检查值:
[RegularExpression("^[0-9]*$", ErrorMessage = "Your fill the wrong content!")]
如果要在保存之前设置默认值,可以在类中执行以下操作:
public Request()
{
Gender = "male";
Name = "default name"
}
希望对大家有所帮助 如果您不提供性别,我不知道为什么您的模型有效,但您可以通过将性别值定义为可空,使该值不具有默认值,如下所示:
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
}
[Required]
public Gender? Gender { get; set; }
或者,您可以指定性别的默认值,如下所示:
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
}
[Required]
public Gender? Gender { get; set; }
更新
现在,如果我以xml形式提交原始请求,我可以再次使用以下命令查看结果之间的差异:
标题:内容类型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>
然后我的模型无效,即使值类型有值,我的modelstate告诉我需要Gender属性
由于x-www-form-urlencoded是查询字符串的一部分,因此我猜MVC能够确定该值是否丢失,但当数据以纯xml形式提交时,它无法确定这一点
我建议,如果您希望在所有情况下都使用必需的属性,请按如下方式将值类型设置为null:
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
}
[Required]
public Gender? Gender { get; set; }
您是否已检查您的模型(请求)是否不为null,因为这将导致IsValid为true?该模型不为null,但为性别枚举分配了一个默认值。我无法重现您的问题,您使用什么发布数据?当我发布数据(使用Chrome addin Postman)时,未提供的值为空,因此我的模型无效。@DavidMartin:我已更新了我的问题。请看一看谢谢大卫。但是,为enum提供默认值是webapi的默认行为吗?我使用一个整数值进行了测试,它也为integer指定了一个默认值。这只是我的问题,还是你面临着同样的问题>这与webapi无关,只是值类型和引用类型之间的区别-谢谢David。因此,我必须编写一个
自定义方法
,该方法将验证模型值,尽管具有过滤器属性
?您不必这样做,我的代码正确地验证了没有提供性别值,所以在这个问题上,我不确定为什么你的行为不符合预期。我已经更新了我的答案,现在我明白了为什么我们会得到不同的结果。