2017-09-16 12 views
0

私はasp net web apiを使用するために新規です。 私のWeb 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'にはなりません - デフォルトで必須です。あなたの特定のエラーメッセージが欲しい) –

答えて

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

その投稿はあなたに役立つかもしれません[リンク](https://stackoverflow.com/questions/32772792/httprequest-content-ismimemultipartcontent-is-returning-false-when-it-should-r) – Merchezatter

関連する問題