Angularjs MVCWebAPI发布JSON数据给了我一个404

Angularjs MVCWebAPI发布JSON数据给了我一个404,angularjs,asp.net-web-api,Angularjs,Asp.net Web Api,我在MVC4中有一个Web API。我在使用ajax发布数据时得到了404,我不明白为什么 语言控制器: [AcceptVerbs("POST")] public void Delete(string id) { Guid guid = Guid.Parse(id); Language language = db.Languages.Find(guid); db.Languages.Remove(language); db.SaveChanges(); }

我在MVC4中有一个Web API。我在使用ajax发布数据时得到了404,我不明白为什么

语言控制器:

[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):

我收到以下错误消息:

**{"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."}**

我只是不明白为什么,它看起来应该会起作用。我觉得我丢失了一条重要信息。

代码的文件名public void Delete(string id)应命名为“languageController”。请核对姓名


另外,更好的使用删除操作的方法应该是“删除”而不是“发布”

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。。。我可能可以通过使用视图模型而不是语言模型来改进它。

我的控制器称为“LanguageController”。我想让这篇文章与post一起工作,因为在我完成这项工作之后,我需要发送其他更复杂的数据。正如Cuong Le已经说过的,当删除方法时,应该侦听
HttpDelete
请求,而不是
HttpGet
请求。因为您使用的是Web API,发送整个语言对象只是为了删除它似乎是多余的。不能将
[HttpDelete]
属性与
公共无效删除([FromUri]int-id)
结合使用吗?(注意额外的参数属性)这样,如果调用
/language/delete?id=X
,它应该可以工作?问题是如何将数据发布到服务器,而不是执行删除操作的最佳方式。很抱歉,我选择删除来测试这一点,我确信这是令人困惑的。你的评论是正确的,但没有回答我想知道的问题——如果你读了我上面的回答,你就会明白。你是对的,我误解了你的问题。您提供的解决方案在您的案例中确实是正确的。
[AcceptVerbs("POST")]
public void Delete(Language lang)
{    
    Language language = db.Languages.Find(lang.ID);
    db.Languages.Remove(language);
    db.SaveChanges();    
}