2017-09-16 4 views
0

Ich bin neu für die Verwendung von ASP Net Web API. Ich möchte UploadDocument-Funktion in meiner Web-API erstellen. Also, ich erschaffe diesen Weg.aspnet web api wie Validierung mit ModelState in mehrteiligen Form Daten?

Von Client-

api.post('vendor/UploadDocument', formData, { headers: { 'Content-Type': 'multipart/form-data' } }) 

-Controller

public class VendorController : ApiController { 
    [HttpPost] 
    public HttpResponseMessage UploadDocument() 
    { 
     try 
     { 
      if (!Request.Content.IsMimeMultipartContent()) 
      throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 

      var request = HttpContext.Current.Request; 
      var model = new UploadDocumentViewModel(); 
      model.field1 = request.Form["field1"]; 
      model.field2 = request.Form["field2"]; 
      model.Document = request.Files["Document"]; 

      if (ModelState.IsValid) 
      { 
       return Request.CreateResponse(HttpStatusCode.OK); 
      } 
      else //ModelState is not valid 
      { 
       return Request.CreateResponse(HttpStatusCode.BadRequest); 
      } 
     } 
     catch (Exception exception) 
     { 
      return Request.CreateResponse(HttpStatusCode.InternalServerError); 
     } 
    } 
} 

Modell

public class UploadDocumentViewModel 
{ 
    [Required] 
    public string field1 { get; set; } 

    [Required] 
    public int field2 { get; set; } 

    [Required] 
    public HttpPostedFile Document { get; set; } 
} 

Mein Problem ist, in Controller Model immer leer. Ich habe versucht, Code

Validate(model); 
if (ModelState.IsValid)... 

hinzufügen, aber es hat nicht zu arbeiten. kann jemand eine Idee für die Validierung von Modelldatenanmerkungen in mehrteiligen Formulardaten haben?

+0

Ihre POST-Methode enthält kein Modell, daher gibt es nichts zu validieren. Machen Sie Ihre Methode 'UploadDocument (UploadDocumentViewModel model)' und sie wird mit den geposteten Werten gebunden (als eine Randnotiz kann ein 'int' nicht' null' sein - es ist standardmäßig erforderlich, so dass Ihr '[Required]' Attribut unnötig ist du wolltest eine spezifische Fehlermeldung) –

Antwort

1

versuchen klar Modellzustand überprüfen, bevor

ModelState.Clear(); 
this.Validate(model); 
if (ModelState.IsValid) { 

} 

prüfen diese Antwort: Custom DataAnnotation

+0

danke Huseyin, dein Code funktioniert für mich. – edidiway

+0

Sie sind willkommen :) bitte Genehmigung für andere Leute zu profitieren –

0

Ihre Methode sollte wie folgt aussehen:

public class VendorController : ApiController { 

     [HttpPost] 
     public IHttpActionResult UploadDocument(UploadDocumentViewModel viewModel) 
     { 
      try 
      { 
       if (!Request.Content.IsMimeMultipartContent()) 
return StatusCode(HttpStatusCode.UnsupportedMediaType); 

       if (viewNodel == null) 
        return BadRequest("Model is empty"); 

       var field1 = viewModel.field1; 
       var field2 = viewModel.field2; 
       var documents = viewModel.document; 

       if (ModelState.IsValid) 
       { 
        return Ok(); 
       } 
       else 
       { 
        return BadRequest(ModelState); 
       } 
      } 
      catch (Exception exception) 
      { 
       return InternalServerError(exception); 
      } 
     } 
    } 

ziehe ich einige dieser Validierungen in Aktion vorbei Filter, um Ihre Methoden sauberer zu machen (try/catch, modestate).

Wenn Sie Probleme mit der Modellbindung haben, können Sie Ihren benutzerdefinierten Modellbinder implementieren.

+0

Hallo Merchezatter, ich habe versucht, Sie Lösung, aber einen Fehler vom Browser sagte : 415 (nicht unterstützte Medientyp), ich die Daten mit Multipart/Form-Daten nicht json. – edidiway

+0

Sieht aus, als hätte Ihr Controller eine andere Meinung über den Datentyp, den Sie übergeben. Welchen Typ haben Ihre "formData"? Ist das MultipartFormDataContent? – Merchezatter

+0

dieser Beitrag kann für Sie hilfreich sein [link] (https://stackoverflow.com/questions/32772792/httprequest-content-ismimemultipartcontent-iszurückkehren-falschen-when-it-should-r) – Merchezatter

Verwandte Themen