2017-09-23 64 views
2
正確方法

在控制器設置MVC與擴展方法在ASP.Net核心禁用模型驗證2 MVC

services.AddMvc() 

然後,這可能也適用於GET,創建POST操作的方法在體內提供一個參數,例如

[HttpPost("save")] 
public Entity Save([FromBody]Entity someEntity) 

當動作被稱爲MVC管道將調用依次調用DefaultObjectValidator的ParameterBinder。我不想驗證(它緩慢的一兩件事,但更重要的是循環的複雜週期圖形),但似乎關閉驗證,在管道中的唯一方法是這樣的:

public class NonValidatingValidator : IObjectModelValidator 
{ 
    public void Validate(ActionContext actionContext, ValidationStateDictionary validationState, string prefix, object model) 
    { 
    } 
} 

並在啓動/ ConfigureServices:

 var validator = services.FirstOrDefault(s => s.ServiceType == typeof(IObjectModelValidator)); 
     if (validator != null) 
     { 
      services.Remove(validator); 
      services.Add(new ServiceDescriptor(typeof(IObjectModelValidator), _ => new NonValidatingValidator(), ServiceLifetime.Singleton)); 
     } 

這似乎像一個大錘。我環顧四周,無法找到替代品,也試圖刪除DataAnnotationModelValidator而沒有成功,所以想知道是否有更好/正確的方法來關閉驗證?

+0

我認爲你的解決方案很好。你可以簡化依賴註冊:'services.AddSingleton (new NonValidatingValidator());' – thejman

回答

0

.AddMvc()擴展方法有一個重載,您可以在其中配置很多東西。其中之一是ModelValidatorProviders的列表。

如果清除該列表,例如:

services.AddMvc(options => options.ModelValidatorProviders.Clear()); 

驗證不應該發生的任何更長的時間。

+0

同樣不幸的是,這是堆棧的一部分:'\t \t Microsoft.AspNetCore.Mvc.Core.dll!Microsoft。 AspNetCore.Mvc.Internal.DefaultObjectValidator.Validate(Microsoft.AspNetCore.Mvc.ActionContext actionContext,Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ValidationStateDictionary validationState,字符串前綴,對象模型)\t未知\t非用戶代碼。跳過的加載符號。 \t Microsoft.AspNetCore.Mvc.Core.dll!Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder.BindModelAsync(Microsoft.AspNetCore.Mvc.ActionContext actionContext,Microsoft.AspNetCore.Mvc.ModelBinding.IModelBinder modelBinder' –

+0

相同的是什麼?您是 – ypsilo0n

+0

不,我的意思是它仍然調用DefaultObjectValidator,我想在「我們有驗證器,如果沒有添加DefaultObjectValidator」的行中存在一些代碼) –