2013-08-14 6 views
8

Nella mia applicazione API ASP.NET MVC, posso restituire un utile ErrorResponse se alcuni dei miei Required campi mancano:Tornando una risposta di errore nel caso di un modello nullo

return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState); 

-

"Message": "The request is invalid.", 
     "ModelState": { 
      "myModel.FooA": [ 
       "The FooA is required." 
      ], 
      "myModel.FooC": [ 
       "The FooC property is required." 
      ], 
      "myModel.FooD": [ 
       "The FooD property is required." 
      ] 
     } 

Tuttavia, come this answer conferma, un modello NULL volontà validate. Siccome non lo permetto, come posso restituire una risposta di errore altrettanto utile che afferma tutti i valori richiesti? So che posso aggiungere manualmente un errore ModelError per ogni proprietà, ma ho il sospetto che ci possa essere un modo in cui lo CreateErrorResponse può farlo per me.

+0

Ciao @ Jonathan. Il riferimento sopra ha un controllo se il modello non è nullo. Nel caso sia nullo, puoi controllare il suggerimento qui sotto. –

+0

Puoi chiamare 'Controller.ValidateModel (new MyClass())' se il tuo oggetto è nullo? (nb, 'ValidateModel' è un metodo sulla classe' Controller'). vedi http://stackoverflow.com/questions/6360087/manually-invoking-modelstate-validation – wal

+0

non esiste un modo automatico per ottenere ciò che desideri. è necessario un legatore di modelli personalizzato –

risposta

3

Stai utilizzando mvc3 o web-api? i tuoi tag indicano che stai usando mvc ma la tua frase di apertura implica web-api. Se si utilizza MVC3 è possibile utilizzare il seguente:

Nel vostro controller prima della chiamata a ModelState.IsValid aggiungere:

if (modelObj == null) 
{ 
    ModelState.Clear(); 
    var blankModel = new MyClass(); 
    TryValidateModel(blankModel); 
    return View("About", blankModel);   
} 

Se si sta utilizzando web-api e supponendo che si sta utilizzando System.ComponentModel.DataAnnotations voi possibile utilizzare il seguente:

ModelState.Clear(); 

var model = new MyClass(); 
var results = new List<ValidationResult>(); 
Validator.TryValidateObject(model, new ValidationContext(model, null, null), 
                   results, true); 

var modelState = new ModelStateDictionary(); 
foreach (var validationResult in results) 
    modelState.AddModelError(validationResult.MemberNames.ToArray()[0], 
               validationResult.ErrorMessage); 

return Request.CreateErrorResponse(HttpStatusCode.BadRequest, modelState); 
+0

+1 per 'TryValidateModel' –

Problemi correlati