3

我正在使用 ASP.NET Web API。如果没有参数,我的控制器中有一个动作可以正常工作。如果有参数,比如:

public string UploadFile(string actionType)

然后我的操作没有被调用,我收到以下消息,在 Fiddler 中查看:

没有“MediaTypeFormatter”可用于读取媒体类型为“multipart/form-data”的“String”类型的对象

我的路线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',

有些事情要注意...

  • 我以文本“发布...”开头您的操作名称,这很重要,名称的其余部分不
  • 您的帖子网址被缩短为控制器的名称。
  • 我在这里更深入地解释了映射

编辑

显然你遇到了一个奇怪的 WebAPI。解决这个问题的方法是将您的“actionType”参数填充到一个简单的对象中,以便模型绑定可以接管。

Rick Strahl在这里解释了这一点和其他一些具有约束力的怪事。还有另一个解决类似问题的SO question 。

于 2012-05-07T03:57:34.720 回答