2017-09-16 19 views
0

asp net web api를 사용하는 데있어서 새로운 기능입니다. 내 웹 API에서 UploadDocument 기능을 만들고 싶습니다. 그래서이 방법을 만듭니다. 클라이언트에서aspnet web api 다중 파트 양식 데이터에서 modelstate를 사용하여 유효성을 검사하는 방법은 무엇입니까?

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

컨트롤러

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

모델

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

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

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

내 문제는 컨트롤러 ModelState에서 항상 비어 있습니다. 코드를 추가하려고 시도했습니다.

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

그러나 작동하지 않았습니다. 멀티 파트 양식 데이터에서 모델 데이터 주석의 유효성을 검사 할 수 있습니까?

+0

POST 메소드에는 모델이 없으므로 유효성을 검사 할 항목이 없습니다. 메소드'UploadDocument (UploadDocumentViewModel model)'을 작성하면 게시 된 값과 바인드됩니다 (부작용으로'int'는'null'이 될 수 없습니다 - 기본적으로 필요합니다. 그래서'[Required]'속성은 필요하지 않습니다. 원하는 특정 오류 메시지) –

답변

1

전에이 대답

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

} 

확인을 검증 명확한 모델 상태를 시도 : Custom DataAnnotation

+0

감사합니다 Huseyin, 나를 위해 코드 작업. – edidiway

+0

당신은 환영합니다 :) 다른 사람들에게 도움을 청하기 위해 승인을주십시오. –

0

귀하의 방법은 다음과 같아야합니다

내가 행동에 그 검증의 일부를 통과 선호
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); 
      } 
     } 
    } 

필터를 사용하여 메소드를보다 명확하게 만들 수 있습니다 (try/catch, modelstate).

모델 바인딩에 문제가있는 경우 사용자 정의 모델 바인더를 구현할 수 있습니다.

+0

안녕 Merchezatter, 해결책을 시도했지만 브라우저에서 오류가 발생했습니다 : 415 (지원되지 않는 미디어 유형), multipart/form-data를 사용하여 데이터를 게시합니다. , 아닙니다 json. – edidiway

+0

컨트롤러가 전달하는 데이터 유형에 대한 또 다른 의견이있는 것처럼 보입니다. "formData"에는 어떤 유형이 있습니까? 그게 MultipartFormDataContent인가요? – Merchezatter

+0

해당 게시물이 도움이 될 수 있습니다. [link] (https://stackoverflow.com/questions/32772792/httprequest-content-ismimemultipartcontent-is-returning-false-when-it-should-r) – Merchezatter