2017-01-26 21 views

cevap

7

Bir ActionFilter kullanabilirsiniz: aksiyon ModelState geçerli olmak ve kontrol etmek gerek değil güvenebileceğini eğer iyi olurdu. Global olarak değil, ancak problemi yöntem gövdesinden bir niteliğe taşıyor. Probleminizi tamamen çözmediğinin farkındayım, ama hiçbir şeyden daha iyi olmayabilir.

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); 
    } 
} 

Ve denetleyicisi

:

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

} 

ben siz de Kumandanızda ayarlayabilirsiniz inanıyoruz. Bunu gerçekten denemedim ama according to this işe yarayabilirdi.

[ModelStateValidationActionFilter] 
public class MyApiController : ApiController 
{ 

} 

DÜZENLEME:

@Camilo Terevinto olarak, Çekirdek için biraz farklıdır söz. Core kullanmak istiyorsanız, sadece bu ActionFilter kullanın.

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' Web Api 2'den, bu ASP.NET Core artık yok. Bunun yanı sıra, filtrelerinize 'ActionFilterAttribute' yerine sadece 'Attribute' eklememelisiniz. Daha da fazla niyet, 'ValidateModelStateAttribute' –

+0

olacaktır. Ayrıca, 'Startup' –

+0

@CamiloTerevinto'da eylem filtreleri global olarak kaydedilebilir, evet, haklısınız. Çekirdek kısmını özledim.Cevabımı Core ile çalışacak uygun bir ActionFilterAttribute ile güncelledim. – smoksnes

5

mevcut cevaplar şu ana kadar ASP.NET Çekirdek için ASP.NET Web API değil içindir.

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 
    } 
} 

Ve Startup.csyılında global olarak bu filtreyi kaydedebilirsiniz, bu nedenle bu her çağrıda çalıştırır ve bunu tekrarlamak zorunda değilsiniz: ASP.NET Çekirdek bunu yapmak için gerçek yoludur Her Eylemde/Denetleyicide:

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

Daha fazla bilgi edinin in the official documentation.

0

Kullanım HandleInvalidModelState

PM> Install-Package HandleInvalidModelState

örnek

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

temel olgu senaryosu yanında paket Json ve isteğin Redirection dönen destekler (geçersiz modelle görünümü dönen).

uyarı: Paketin yazarı