【发布时间】:2017-09-20 14:36:25
【问题描述】:
如果您将 [Required] 放在引用类型上,并提供没有匹配 JSON 属性的 JSON,则会引发错误。
除了使用可为空的值类型或在类中包装值类型之外,是否可以在反序列化对 Web API 的请求时对值类型强制执行 [Required]?
Required 不会在下面的 Test1 上强制执行,因为它被强制为默认值零。即,如果您的 JSON 不包含 Field1 属性,序列化仍会成功完成。
我希望能够将 [Required] 放在我的值类型上,或者可能编写一个新属性来完成此操作。
有这样的设置吗?或者,是否可以利用 XML 和 JSON 的反序列化来实现这一点?
public async Task<IHttpActionResult> Method1(Clas1 model){}
public class Class1
{
...
[Required]
public int Field1 { get; set; }
}
Although it may not be possible with attributes,理论上反序列化器可以在将值强制为值类型之前检查属性。如果是这样,是否有我可以做到这一点的事件或设置?
使用 Json.net,我可以添加一个属性 [JsonProperty(Required = Required.AllowNull)]。我可以为 XML 反序列化做类似的事情吗?
即:
// POST api/Account/Register
[AllowAnonymous]
[Route("Register")]
public async Task<IHttpActionResult> Register(RegisterBindingModel model)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var user = new ApplicationUser() { UserName = model.Email, Email = model.Email };
public class RegisterBindingModel //: IValidatableObject
{
[Required]
public string Email { get; set; }
public int Test1 { get; set; }
[Required]
public int Test3 { get; set; }
<RegisterBindingModel xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/WebApplication1.Models">
<Email>Sample string 2</Email>
<Test1>2</Test1>
</RegisterBindingModel>
【问题讨论】:
-
它不总是有价值的吗?当您实例化该类时,如果
Field1未明确设置为其他值,则其值为 0。 -
会的。但是如果没有明确提供 Field1,我想使 ModelState 无效并拒绝请求
-
除了使用可空值类型 - 你为什么不考虑这种方法?
-
我有一个很大的 API,不想把所有的原语都改成可以为空的类型。很难验证我不会影响业务需求
-
改为可空或使用Range,我更喜欢使用Range。 stackoverflow.com/questions/6662976/…
标签: c# asp.net-web-api2 deserialization data-annotations c#-6.0