AngularJS回归404

时间:2014-07-23 19:07:59

标签: c# javascript ajax asp.net-mvc angularjs

使用AngularJS的“$ http.put”时,我收到PUT请求的404错误。

这是我的相关AngularJS代码:

    /* toggles whether or not the link is disabled */
    toggleLinkStatus: function (isActive, linkGUID) {
        $http.put('/Explorer/Link/ToggleLinkStatus',
                {

                            isActive: isActive,
                            linkGUID: linkGUID
                }
        );
    }

我的相关C#控制器代码:

    [HttpPut]
    public IHttpActionResult ToggleLinkStatus(Boolean isActive, Guid linkGUID)
    {
        return Ok();
    }

我的WebApiConfig代码

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        /** define routes for Explorer API */
        config.Routes.MapHttpRoute(
            name: "ExplorerAPI",
            routeTemplate: "Explorer/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

我在这里缺少什么?在调用的Headers中,我可以看到数据正在Request Payload中传递:

isActive: true
linkGUID: "b94badb3-2917-4129-9ae3-35d2a635f66d"

如果我使用POSTMAN执行普通查询字符串PUT,它会通过,但不会在我使用AngularJS时。

更新

这里有一些有趣的东西,如果我使用以下angularJS请求,它会通过:

    /* toggles whether or not the link is disabled */
    toggleLinkStatus: function (isActive, linkGUID) {
        $http.put('/Explorer/Link/ToggleLinkStatus',
                {
                    isActive: isActive,
                    linkGUID: linkGUID
                },
                {
                    params:
                        {
                            isActive: isActive,
                            linkGUID: linkGUID
                        }
                }
        );
    }

它也适用于此:

    /* toggles whether or not the link is disabled */
    toggleLinkStatus: function (isActive, linkGUID) {
        $http.put('/Explorer/Link/ToggleLinkStatus',
                {
                },
                {
                    params:
                        {
                            isActive: isActive,
                            linkGUID: linkGUID
                        }
                }
        );
    }

2 个答案:

答案 0 :(得分:0)

如果您成功使用GET(在浏览器地址栏中执行此操作)但未成功使用PUT,那么您在配置路由/等方面出现了问题。我看不出它是什么你在这里的代码片段,但你如何配置你的路线肯定有些不对劲。也许有一条早期的路线与GET相匹配。这不是Angular的错。你可以使用Chrome的PostMan插件进行测试,它可以让你发送PUT / POST / DELETE以及GET,你可以看到结果。

答案 1 :(得分:0)

尝试更改控制器操作以使用类而不是原始数据类型。 MVC试图从URI而不是请求体中读取这些内容。

像这样:

[HttpPut]
public IHttpActionResult ToggleLinkStatus(RequestModel model)
{
    // model.IsActive ...
    return Ok();
}

public class RequestModel {
    bool IsActive {get;set;}
    Guid LinkGuid {get;set;}
}