1

我在 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):

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

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

4

2 回答 2

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

于 2013-08-09T12:02:46.337 回答
0

代码public void Delete(string id)的文件名应命名为“languageController”。请检查名称

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

于 2013-08-09T11:07:24.340 回答