2012-05-06 8 views
3

私はASP.NET Web APIを使用しています。私はパラメータがない場合、正常に動作する私のコントローラにアクションがあります。以下のようなパラメータが存在する場合:'MediaTypeFormatter'は、 'String'型のオブジェクトを読み取ることができません。

public string UploadFile(string actionType) 

その後、私のアクションが呼び出されていないと私はフィドラーで表示次のメッセージ、取得:

いいえ「MediaTypeFormatterは」のオブジェクトを読み取るために利用可能です次のように私のglobal.asxでメディアタイプ「マルチパート/フォームデータ」

ルートとタイプ「string」は次のとおりです。

"api/{controller}/{action}/{actionType}" 

私がアクションを呼び出すためにjQueryのポストを使用しています:

function upload() { 

     var actiontype = $("input:radio[name=actiontype]").val(); 
     var formData = new FormData($('form')[0]); 

     $.ajax({ 
      url: 'api/uploads/uploadfile/' + actiontype, 
      type: 'POST', 
      success: function (data) { 
       $("#mydiv").append(data); 
      }, 
      error: function (data) { 
       $("#mydiv").append(data); 
      }, 
      data: formData, 
      cache: false, 
      contentType: false, 
      processData: false 
     }); 
    }; 

ここに私のアクションメソッドです:

public string UploadFile(string actionType) 
    { 
     if (Request.Content.IsMimeMultipartContent()) 
     { 
      //Save file 
      MultipartFormDataStreamProvider provider = new MultipartFormDataStreamProvider(HttpContext.Current.Server.MapPath("~/Files")); 
      Request.Content.ReadAsMultipartAsync(provider); 
     } 

     return string.Format("Action {0} Complete!", actionType); 
    } 

は、この回避策で、既知の問題ですか?パラメータを使用して単純なアクションを実行するにはどうすればよいですか?

答えて

1

デフォルトルートを使用していると仮定すると、誤ったパスに投稿されているように見えます。これは、MVC開発者が遭遇するように見える共通の混乱です(私が行ったことを知っています)。 MVCは、/Controller/Actionのようなデフォルトパスを使用します。

Web APIのデフォルトルーティング設定では、アクション名はスキップされ(/api/Controller)、メソッドはHTTP動詞名(post)、メソッド名(Post___)、および必要に応じてパラメータの交差点で見つけられます。

Uploadsという名前のAPIコントローラがあると仮定すると、PostUploadFileという名前のアクションが必要です。

$.ajax({ 
     url: 'api/uploads/', 
     type: 'POST', 

注目すべきいくつかの事柄...

  • は、私はテキストを使用して、アクションの名前を開始した「ポスト...」この問題は、名前の残りの部分は
  • はしていませんあなた投稿URLはコントローラの名前に短くなっていました。
  • mapping hereを詳しく説明しました。

EDIT

どうやらあなたはWebAPIののodityを経験します。これを回避する方法は、単純なオブジェクトに "actionType"パラメータを埋め込むことです。モデルバインディングが引き継ぐことができます。

Rick Strahlがこれを説明し、some other binding oddities hereと説明しています。同様の問題に対処するanother SO questionもあります。

+0

ありがとうございました。実際に私はWebフォームを使用しています - グローバルテンプレートには、 "api/{controller}/{action}/{actionType}"と定義されたルートテンプレートがあります。パラメータがなければ正常に動作することを覚えておいてください。そうするためにはs/tがあると思われます。 – Rivka

+0

Webforms..huh?あなたのコントローラは 'ApiController'から継承していますか? firebug/fiddler/whateverを使用しています...要求ヘッダの「Accept」に何が記載されていますか?あなたがjson backを賞賛していると仮定すると、それは 'application/json'でなければなりません。あなたのajax呼び出しの一部として 'dataType:json'が必要な場合があります。 – EBarr

+0

私のコントローラは、apicontrollerから継承しません。フィドラーでは、コンテンツタイプは 'application/json'です。現在のAjaxコールを反映するようにOPを編集しました。 – Rivka

関連する問題