2017-04-11 53 views
1

我有使用ASP NET核心(不老的Web API或MVC)一個簡單的動作:如何在MVC Core中處理空模型驗證?

[HttpPost] 
public async Task<SomeResponse> Something([FromBody] SomeRequest request) 
{ 
    // request is null here when the POST body is empty 
} 

當我發佈一個空的身體request爲空。如果有任何模型驗證錯誤,我有一個全局操作篩選器,可返回通用400響應。

public class ValidateModelBindingAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext context) 
    { 
     if (!context.ModelState.IsValid) 
     { 
      // 400 response here. 
     } 
    } 
} 

我想的ModelState是無效的,如果身體是空的,這樣的驗證過濾器會試圖執行一個空請求對象的動作前,用400響應。我試圖給request參數添加一個[Required]屬性,但不起作用。那裏有另外的解決方案嗎?

+0

你可以發佈請求類代碼嗎? – Krishna

回答

1

它認爲Null模型有效,因爲它在null情況下,將0這就是檢查ModelState.ErrorCount爲什麼會認爲它是有效的模型,所以你可以試試這個

public class ValidateViewModelAttribute : ActionFilterAttribute 
     { 
      public override void OnActionExecuting(ActionExecutingContext actionContext) 
      { 
       if (actionContext.ActionArguments.Any(x => x.Value == null)) 
       { 
        actionContext.Result = new BadRequestObjectResult(HttpStatusCode.BadRequest); 

       } 

       if (actionContext.ModelState.IsValid == false) 
       { 
        actionContext.Result = new BadRequestObjectResult(HttpStatusCode.BadRequest); 
       } 
      } 
     } 

不要忘記添加ValidateViewModel屬性action

+0

@Brandon讓我知道它是否有效 – Usman

+0

這可行,但它不完全是我所希望的解決方案。我不想對所有操作應用非空約束。我還希望能夠說一個動作中的一個特定參數不能爲空,但可以是另一個參數。 –