0

有沒有辦法覆蓋ModelState.IsValid阻止ModelState.IsValid驗證附加實體嗎?

有些要驗證的實體只是附屬實體,因此除ID之外的所有字段都不會被驗證,因爲實體處於Unchanged狀態。

有沒有辦法做到這一點?
有沒有人遇到過這個問題?

更新

說我有以下作用:

[HttpPost] 
public ActionResult SaveEntity(MyEntity entity) 
{ 
    var isValid = ModelState.IsValid; //false 
} 

由於模型驗證所有屬性和entity所有後代的特性,必須有來檢查的每個實體的方式那些後代,無論它是否與上下文相關,並且如果是,則從ModelState中刪除錯誤,如下所示:

public ActionResult TryValidateDetachedModel(MyEntity entity, DbContext context) 
{ 
    foreach (var ms in ModelState.Where(ms => ms.Value.Errors.Any()).ToArray())    
    // should iterate over something like GetAllEntityTypesMetadata() 
    { 
     var entity = GetEntityFromMetadata(ms); 
     if (context.Entry(entity).State == EntityState.Unchanged) 
     { 
      ms.Value.Errors.Clear();     
     } 
    } 
} 

我在上面的僞代碼中試圖做的是檢查驗證鏈中的實體,如果其中一個附加爲Unchanged,請跳過驗證/刪除其錯誤。

現在我必須通過檢查ModelState.Key來手動硬編碼,我正在尋找更通用和更高效的方法。

+0

爲什麼你綁定到EF對象,而不是指定的視圖模型? – LukLed

+0

我使用POCO實體,所以它沒有區別。 – Shimmy

+0

顯然它有所不同,因爲在專用視圖模型中你不會有這個問題。 – LukLed

回答

1

要清除所有錯誤,下次使用

ModelState.Clear();

問候

0

這是我做什麼,以確保驗證僅適用於當前實體:

 foreach (var key in ModelState.Keys) 
      if (key.Split('.').Length > 2) 
       ModelState[key].Errors.Clear(); 

     if (!ModelState.IsValid) 
      return BadRequest(ModelState); 

的支票.的出現意味着:如果模型狀態鍵類似於currentDTO.relatedDTO.field之類,那麼驗證錯誤r被忽略(清除)。如果它只是idcurrentDTO.validateThisField,那麼它不會被清除。