2014-05-03 4 views
8

Tworzę formularz internetowy AngularJS, aby wykonać POST (wstawić) do tabeli przy użyciu konfiguracji WebAPI jako OData. Próbuję odzyskać nieudany obiekt sprawdzania poprawności ModelState (w formacie JSON) w celu sprawdzenia poprawności odpowiednich pól w formularzu.Błąd sprawdzania poprawności ODAP WebAPI Niepoprawiony obiekt ModelState

Wszystko wrócę to pojedynczy łańcuch ze wszystkimi szczegółami w postaci ciągu znaków (nie w JSON parsable format)

{ 
    "odata.error":{ 
    "code":"","message":{ 
     "lang":"en-US","value":"The request is invalid." 
    },"innererror":{ 
     "message":"application.ApplicationName : The ApplicationName field is required.\r\n","type":"","stacktrace":"" 
    } 
    } 
} 

Moja metoda postu wygląda tak:

public async Task<IHttpActionResult> Post(Application application) 
     { 
      if (!ModelState.IsValid) 
      { 
       return BadRequest(ModelState); 
      } 

      db.Applications.Add(application); 
      await db.SaveChangesAsync(); 

      return Created(application); 
     } 

I próbowałem nawet abstrahować to do ActionFilterAttribute, ale wciąż taki sam wynik:

public class ValidateModelAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext) 
     { 
      if (actionContext.ModelState.IsValid == false) 
      { 

       var modelState = actionContext.ModelState; 

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

      } 
     } 
    } 
rozpocząć metoda ma następującą konfigurację:

public static class WebApiConfig 
    { 
     public static void Register(HttpConfiguration config) 
     { 

      config.Routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "api/{controller}/{id}", 
       defaults: new { id = RouteParameter.Optional } 
      ); 

      ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); 
      builder.EntitySet<Application>("DataApplications"); 
      config.Routes.MapODataRoute("odata", "odata", builder.GetEdmModel()); 


      config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Include }; 

      Configure(config); 

      config.EnableQuerySupport(); 

      // Use camel case for JSON data. 
      config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 

To jest to, co chcę osiągnąć (nie pasuje do mojego przykładu):

{ 
    "Message": "The request is invalid.", 
    "ModelState": { 
     "car": [ 
      "Required property 'Make' not found in JSON. Path '', line 1, position 57." 
     ], 
     "car.Make" : [ 
      "The Make field is required." 
     ], 
     "car.Price": [ 
      "The field Price must be between 0 and 200000." 
     ] 
    } 
} 

muszę ModelState z powrotem, tak można kierować komentarze Zatwierdzenia na odpowiednie pola.

Jakieś pomysły, które mogę sprawdzić/zmienić, aby działały zgodnie z oczekiwaniami?

Dzięki.

Update 1 - odniesienie znaleźć na ASP.NET

http://www.asp.net/aspnet/overview/aspnet-and-visual-studio-2012/aspnet-and-web-tools-20122-release-notes

OData odpowiedź błąd nie zawierają błędów modelowych państwowych

Tworząc odpowiedź błędu przy użyciu metody rozszerzenie CreateErrorResponse bezpośrednio lub HttpErrors błąd jest mapowany na odpowiedź błędu OData. Wszelkie błędy stanu modelu w odpowiedzi na błąd nie są propagowane do odpowiedzi błędu OData. Aby zachować błędy stanu modelu w odpowiedzi na błąd OData, użyj bezpośrednio metody rozszerzenia CreateODataErrorResponse lub ODataError i dodaj opisy błędów stanu modelu do komunikatu o błędzie OData.

+0

Czy znalazłeś rozwiązanie? – iuristona

Odpowiedz

0

Jako odpowiedź na błąd OData używa ODataError. Różnica między wartościami ODataError i HttpEror polega na tym, że wartość HttpError pochodzi z Dictionary<string, object>, więc gdy jest wykonywana z ModelStateDictionary, wszystkie błędy modelu są ustawiane na właściwość ModelState. Jednak, gdy żądasz OData, obiekt HttpError jest mapowany na ODataError, a wszystkie błędy sprawdzania poprawności są łączone z właściwością InnterError.