我正在使用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);
}
这是一个已知问题,有一个解决方法吗?如何使用参数进行简单的操作?
答案 0 :(得分:1)
假设您使用的是默认路由,则表示您发布的路径不正确。这是MVC开发人员似乎遇到的常见混淆(我知道我做过)。 MVC使用默认路径,如:/Controller/Action
。
但是,在Web API的默认路由设置中,将跳过操作名称(/api/Controller
),然后通过HTTP谓词名称(post),方法名称(Post ___)和参数if的交集找到该方法。必要。
假设您有一个名为Uploads
的API控制器,您应该有一个名为PostUploadFile
的操作。
$.ajax({
url: 'api/uploads/',
type: 'POST',
有些事需要注意......
修改强>
显然你正在体验WebAPI的异味。解决这个问题的方法是将“actionType”参数填充到一个简单的对象中,这样模型绑定就可以接管。
Rick Strahl解释了这一点和some other binding oddities here。还有another SO question解决类似问题。