发布JSON数据的MVC Web API给了我404

时间:2013-08-09 10:58:25

标签: angularjs asp.net-web-api

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

我只是不明白为什么,它看起来应该有效。我觉得我错过了一条至关重要的信息。

2 个答案:

答案 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”。请检查名称

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