2014-05-03 13 views
8

Sto creando un modulo Web AngularJS per eseguire un POST (inserimento) in una tabella utilizzando l'installazione WebAPI come OData. Sto cercando di recuperare un oggetto ModelState di convalida fallito (in formato JSON) per convalidare i campi appropriati su un modulo.WebAPI Convalida fallita OData Oggetto ModelState non restituito

Tutto torno è una singola stringa con tutti i dettagli come una stringa (non in un formato analizzabile JSON)

{ 
    "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":"" 
    } 
    } 
} 

mio metodo post simile a questo:

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

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

      return Created(application); 
     } 

I hanno anche cercato astrazione ad un ActionFilterAttribute, ma ancora lo stesso risultato

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

      } 
     } 
    } 

mio WebAPI Metodo di iniziare ha la seguente configurazione:

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

Questo è ciò che voglio raggiungere (non abbinato al mio esempio di cui sopra):

{ 
    "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." 
     ] 
    } 
} 

Ho bisogno del ModelState posteriore in modo da poter indirizzare il feedback di convalida presso il campi appropriati.

Qualche idea su cosa posso controllare/modificare per farlo funzionare come desiderato?

Grazie.

Update 1 - riferimento trovato asp.net

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

OData risposta di errore non contenga errori statali modello

Quando si crea una risposta di errore utilizzando i metodi di estensione CreateErrorResponse o httpErrors direttamente l'errore è mappato a una risposta di errore OData. Qualsiasi errore di stato del modello nella risposta all'errore non viene propagato alla risposta di errore OData. Per conservare gli errori di stato del modello nella risposta di errore OData, utilizzare direttamente il metodo di estensione CreateODataErrorResponse o ODataError e aggiungere le descrizioni degli errori di stato del modello al messaggio di errore OData.

+0

Hai trovato una soluzione? – iuristona

risposta

0

OData utilizza ODataError come risposta all'errore. La differenza tra ODataError e HttpEror è che HttpError deriva da Dictionary<string, object> così quando è istatiated con ModelStateDictionary, tutti gli errori di modello sono impostati su ModelState proprietà. Tuttavia, quando si richiede OData, l'oggetto HttpError viene associato a ODataError e tutti gli errori di convalida sono concatenati nella proprietà InnterError.

Problemi correlati