根据ASP.NET Web中的模型验证的说法,在模型验证期间,RequiredAttribute不应该对缺少的非空参数产生影响。
“未邮寄”: 在这里,客户端没有为价格或重量指定值。JSON格式化程序为缺失的属性分配默认值为零。 模型状态是有效的,因为零是这些属性的有效值。
我正在更新一段需要在属性上标记的代码,如:
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“属性的方式,这似乎是对所需属性的不当使用,但我只想知道为什么我得到的行为与文档所说的不同。
编辑:我忘了提到,如果我不检查ModelState.IsValid,上面的代码可以正常工作,并看到thing.Id是0。
发布于 2018-11-27 04:10:56
必需意味着您正在强制客户端发送该值。在您的示例中,Web将json转换为0并将Thing.Id初始化为0,但它不是由客户端发送的,因此模型无效。如果不希望强制客户端发送Id值,请删除模型中Id顶部所需的Id值。您可以做的另一件事是,当您想要创建时,从客户端发送0,当您想要更新时,发送不同的值。我不知道为什么要耦合这两个操作,但根据我的说法,您应该有单独的创建和更新操作。
https://stackoverflow.com/questions/53491619
复制相似问题