3

ASP.NET Web API を使用しています。パラメーターがない場合に正常に動作するアクションがコントローラーにあります。次のようなパラメータがある場合:

public string UploadFile(string actionType)

次に、アクションが呼び出されず、Fiddler で表示された次のメッセージが表示されます。

メディア タイプ「multipart/form-data」でタイプ「String」のオブジェクトを読み取るために使用できる「MediaTypeFormatter」はありません

私のルートはglobal.asx次のとおりです。

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

アクションを呼び出すために Jquery Post を使用しています。

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

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

4

1 に答える 1

1

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

ただし、Web API の既定のルーティング設定では、アクション名はスキップされ ( /api/Controller)、メソッドは、HTTP 動詞名 (post)、メソッド名 (Post___)、および必要に応じてパラメーターの交差によって検出されます。

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

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

いくつかの注意事項...

  • あなたのアクションの名前を「投稿...」というテキストで始めました。これは重要です。名前の残りの部分は重要ではありません
  • 投稿の URL は、コントローラーの名前に短縮されました。
  • ここでマッピングについて詳しく説明しました。

編集

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

Rick Strahl は、これとその他の拘束力のある奇妙さをここで説明しています。同様の問題に対処する別の SO の質問もあります。

于 2012-05-07T03:57:34.720 に答える