根据Model Validation in ASP.NET Web API,在模型验证期间,RequiredAttribute应该对丢失的不可为空的参数无效。
“发布中”:
此处,客户未指定价格或权重值。 JSON 格式化程序为缺少的属性分配默认值零。
模型状态有效,因为零是这些的有效值 属性。
我正在更新一段在属性上标有[Required]的代码,如下所示:
public class Thing
{
[Required]
public int Id { get; set; }
}
和控制器方法:
public HttpResponseMessage PutThing(Thing thing)
{
if (ModelState.IsValid)
{
if (thing.Id == 0) // Create
{}
else // Update
{}
}
else
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
}
如果我调试控制器代码,则可以看到“ thing.id”设置为0,但是ModelState.IsValid为false,出现以下错误:
400 BadRequest - Thing.PutThing - {\"thing\":{\"Errors\":[{\"Exception\":{\"ClassName\":\"
Newtonsoft.Json.JsonSerializationException\",\"Message\":\"Required property 'Id' not found in JSON. Path '', line 1, position 332
我是否想知道这是如何工作的?
这似乎是基于控制器方法使用“ id”属性的方式对[Required]属性的不当使用,但我只是想知道为什么我得到的行为不同于文档怎么说。
编辑:我忘了提一下,如果我不检查ModelState.IsValid,上面的代码可以正常工作,并且看到那东西。Id为0。
答案 0 :(得分:0)
[必需]表示您正在强迫客户端发送该值。在您的情况下,Web api会转换您的json并将Thing.Id初始化为0,但是客户端没有发送它,因此该模型无效。如果不想强制客户端发送Id值,请在模型中的Id顶部删除[required]。您可以做的另一件事是,要创建时从客户端发送0,而要更新时则发送另一个值。 我不知道您为什么要结合这两个动作,但是根据我的看法,您应该有单独的动作来进行创建和更新。