[英]Why some of my Data Annotations in my dto class are not working when I validate the Model in my WebApi?
我的Dto類的屬性上帶有數據注釋,但是執行ModelValidation時會忽略其中之一:
Dto類:
public class TestClassDto {
[Required()] //This one is getting ignored!
public virtual System.Guid Id { get; set; }
[StringLength(32)]
[Required()]
public virtual string Type { get; set; }
[Required()]
public virtual string Description { get; set; }
}
原始班級:
public class TestClass {
public virtual System.Guid Id { get; set; }
public virtual string Type { get; set; }
public virtual string Description { get; set; }
}
我的后控制器:
[HttpPost]
public async Task<IActionResult> PostTestClass([FromBody] TestClassDto testClassDto) {
//if (!ModelState.IsValid) return BadRequest(ModelState); Explicit ModelState Validation is not necessary because ControllerBase makes Validation automatically
TestClass testClass = _mapper.Map<TestClassDto, TestClass>(testClassDto);
_uow.TestClassRepository.Add(testClass);
try {
await _uow.CompleteAsync();
} catch (DbUpdateException ex) {
return StatusCode(500, ex.ToString());
}
TestClassDto result = _mapper.Map<TestClass, TestClassDto>(testClass);
return CreatedAtAction("GetTestClass", new { id = result.Id }, "Great");
}
為什么會這樣呢? 任何想法都會有所幫助! 提前致謝 :)
System.Guid
是一個值類型,它具有默認值(實際上是Guid.Empty
的實例),因此它永遠不會為null。 因此, [Required]
屬性將始終通過驗證。
解決方案之一,可能也是最簡單的一種,是使Guid為空,如下所示:
[Required] public virtual System.Guid? Id { get; set; }
或更長的版本:
[Required] public virtual Nullable<System.Guid> Id { get; set; }
驗證的RequiredAttribute檢查值為null,這是屬性的來源:
override bool IsValid(object value) {
if (value == null) {
return false;
}
// only check string length if empty strings are not allowed
var stringValue = value as string;
if (stringValue != null && !AllowEmptyStrings) {
return stringValue.Trim().Length != 0;
}
return true;
}
因為System.Guid是ValueType,所以其值永遠不會為null。 使ID為空可以解決您的問題:
public virtual System.Guid? Id { get; set; }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.