模型验证 - 为什么即使没有提供值,ModelState.IsValid也总是返回true?

时间:2014-06-16 09:47:43

标签: c# .net asp.net-web-api asp.net-mvc-5 asp.net-web-api2

这是关于WEBAPI和。{ 以下是我的Model类。

    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帖子数据中,我根本没有提供Gender的值,标记为[required]

但是ModelState.IsValid返回true,即使在上面的XML中没有值也是如此 为Gender提供。

如何防止WebAPI将默认值分配给模型中的枚举?

任何想法为什么?

2 个答案:

答案 0 :(得分:2)

如果您不提供性别,我不知道您的模型为何有效,但您可以通过将Gender值定义为可为空而使此值不具有默认值,如下所示:

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
} 

<强>更新 如果我以xml提交原始请求,我现在可以再次使用Postman看到我们的结果之间的差异:

标题: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数据:

标题:内容类型应用程序/ x-www-form-urlencoded

id=1,Name=testname

然后我的模型无效,即使值类型有值,我的模型状态告诉我,Gender属性是必需的。

由于x-www-form-urlencoded是查询字符串的一部分,我猜MVC能够确定该值丢失,但是当数据以普通xml的形式提交时,它无法确定。

我建议如果您希望所有属性在所有情况下都可以使用,那么您可以按如下方式使值类型为空:

[Required]
public Gender? Gender { get; set; }

答案 1 :(得分:0)

您只需将Required验证,但您没有检查这样的值:

[RegularExpression("^[0-9]*$", ErrorMessage = "Your fill the wrong content!")]

如果您想在保存之前设置默认值,您可以在班级中执行以下操作:

public Request()
    {
        Gender = "male";
        Name = "default name"
    }

希望能帮到你!