我在MVC4中有一个Web API。我在使用ajax发布数据时得到404,我不明白为什么。
LanguageController:
[AcceptVerbs("POST")]
public void Delete(string id)
{
Guid guid = Guid.Parse(id);
Language language = db.Languages.Find(guid);
db.Languages.Remove(language);
db.SaveChanges();
}
路由:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
}
}
和javascript(使用AngularJS):
this.delete = function (lang) {
$http({
method: "POST",
url: "/api/language/delete",
data: JSON.stringify({ id: lang.id })
})
.success(function (response) {
return true;
})
.error(function (response) {
return false;
});
};
我收到此错误消息:
**{"Message":"No HTTP resource was found that matches the request URI 'http://localhost:32166/api/language/delete'.","MessageDetail":"No action was found on the controller 'Language' that matches the request."}**
我只是不明白为什么,它看起来应该有效。我觉得我错过了一条至关重要的信息。
答案 0 :(得分:2)
Cuong Le的答案是删除请求的正确方法,但这不是我的问题的答案。这更多地与使用MVC和Angular将数据发布到服务器有关,因此删除操作并不重要。
我犯的错误是假设MVC的路由会从发布的数据中提取ID。
我所做的是将我的语言模型添加为我的方法的参数:
[AcceptVerbs("POST")]
public void Delete(Language lang)
{
Language language = db.Languages.Find(lang.ID);
db.Languages.Remove(language);
db.SaveChanges();
}
这解决了我的404并且让我感觉相当愚蠢,因为很明显,路由不仅仅知道将ID拉出来...我可以通过使用视图模型而不是我的语言模型来改进它。
答案 1 :(得分:0)
代码的文件名 public void Delete(string id)应命名为“languageController”。请检查名称
此外,使用“删除”操作的更好方法应该是“删除”而不是“发布”