2017-01-26 17 views
6

w moim kontrolerów ASP.NET Core i zawsze sprawdzić, czy ModelState jest ważny:Waliduj ModelState.IsValid globalnie dla wszystkich kontrolerów

[HttpPost("[action]")] 
public async Task<IActionResult> DoStuff([FromBody]DoStuffRequest request) 
{ 
    if (!ModelState.IsValid) 
    { 
    return BadRequest("invalid parameters"); 
    } 
    else 
    { 
    return Ok("some data")); 
    } 
} 

Czy istnieje sposób na sprawdzenie poprawności ModelState globalnie przy użyciu filtra tak ja nie musisz tego robić ponownie w każdym elemencie API w każdym kontrolerze? Byłoby miło, gdyby działanie może polegać na ModelState jest ważne i nie potrzebują do sprawdzenia:

[HttpPost("[action]")] 
public async Task<IActionResult> DoStuff([FromBody]DoStuffRequest request) 
{ 
    return Ok("some data")); 
} 

Odpowiedz

7

Można użyć ActionFilter. Nie globalnie, ale przenosi problem z ciała metody do atrybutu. Zdaję sobie sprawę, że to nie rozwiązuje całkowicie twojego problemu, ale może być lepsze niż nic.

public class ModelStateValidationActionFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     var modelState = actionContext.ModelState; 

     if (!modelState.IsValid) 
      actionContext.Response = actionContext.Request 
       .CreateErrorResponse(HttpStatusCode.BadRequest, modelState); 
    } 
} 

A w kontrolerze:

[HttpPost] 
[ModelStateValidationActionFilter] 
public IHttpActionResult Post(object model) 
{ 

} 

wierzę, że można ją ustawić na kontrolerze, jak również. Tak naprawdę nie próbowałem tego, ale according to this może działać.

[ModelStateValidationActionFilter] 
public class MyApiController : ApiController 
{ 

} 

Edycja:

Jak wspomniano @Camilo Terevinto jest nieco różne dla rdzenia. Po prostu użyj tego ActionFilter, jeśli chcesz używać Core.

public class ModelStateValidationActionFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext context) 
    {  
     var modelState = context.ModelState; 

     if (!modelState.IsValid) 
      context.Result = new ContentResult() 
      { 
       Content = "Modelstate not valid", 
       StatusCode = 400 
      }; 
     base.OnActionExecuting(context); 
    } 
} 
+1

'ApiController' jest z Web API 2, to nie istnieje już w ASP.NET Core. Poza tym nie powinieneś dodawać do swoich filtrów 'ActionFilterAttribute' raczej tylko' Attribute'. Jeszcze bardziej intencją byłoby "ValidateModelStateAttribute" –

+0

Ponadto, filtry akcji mogą być rejestrowane globalnie w 'Autostartie' –

+0

@CamiloTerevinto, tak, masz rację. Brakowało mi głównej części.Zaktualizowałem swoją odpowiedź odpowiednią właściwością ActionFilterAttribute, która będzie działać z Core. – smoksnes

5

Istniejące do tej pory odpowiedzi na ASP.NET Web API a nie dla ASP.NET Rdzenia. Rzeczywisty sposób to zrobić w ASP.NET Rdzeń jest:

public class SampleActionFilter : IActionFilter 
{ 
    public void OnActionExecuting(ActionExecutingContext context) 
    { 
     // do something before the action executes 
    } 

    public void OnActionExecuted(ActionExecutedContext context) 
    { 
     // do something after the action executes 
    } 
} 

I można zarejestrować ten filtr globalnie w Startup.cs, więc będzie to wykonać w każdej pojedynczej rozmowy i nie trzeba ich powtarzać w każdej akcji/kontroler:

options.Filters.Add(typeof(SampleActionFilter)); 

Zobacz więcej in the official documentation.

0

Zastosowanie HandleInvalidModelState

PM> Install-Package HandleInvalidModelState

przykład

[HttpPost] 
[TypeFilter(typeof(HandleInvalidModelWithViewActionFilterAttribute))] 
public IHttpActionResult Post(object model) 
{} 

Oprócz podstawowych przypadkach scenariusza (powrót widok z nieprawidłowym modelu) Pakiet obsługuje powrocie Json i Redirection żądania.

Zastrzeżenie: autor pakietu

Powiązane problemy