簡體   English   中英

當我在WebApi中驗證模型時,為什么我的dto類中的某些數據注釋不起作用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM