Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 模型验证-为什么ModelState.IsValid即使没有提供值也始终返回true?_C#_.net_Asp.net Web Api_Asp.net Mvc 5_Asp.net Web Api2 - Fatal编程技术网

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。因此,我必须编写一个
自定义方法
,该方法将验证模型值,尽管具有
过滤器属性
?您不必这样做,我的代码正确地验证了没有提供性别值,所以在这个问题上,我不确定为什么你的行为不符合预期。我已经更新了我的答案,现在我明白了为什么我们会得到不同的结果。