如何使用Angularjs的route属性将路径和后置参数传递给WebApi2

时间:2013-12-07 08:12:30

标签: javascript angularjs asp.net-web-api

我正在尝试将我的Web api代码迁移到Web api 2,并且无法理解如何使用angular js。我没有在网上找到那种解释的例子。

这是我的控制器代码:

[RoutePrefix("api/v2/bids")]
public class BidsController : ApiController
{
    [Route("{quoteId:long}/accept")]
    public HttpResponseMessage AcceptShipmentQuote(long quoteId,[FromBody] string data)
    {
        HttpResponseMessage response;
            response = Request.CreateResponse(HttpStatusCode.Accepted, quoteId);
        return response;
    }
}
角度JS上的

我有以下代码:

    function acceptQuote(quoteId, data, fnSuccess, fnError) {
        return $resource("/api/v2/Bids/:quoteId/accept", { quoteId: "@quoteId", data: "@data" },
            { "AcceptQuote": { method: "POST", isArray: false } })
            .AcceptQuote(quoteId, data, fnSuccess, fnError);
        }

但这不像小提琴手那样工作我看到 quoteId 没有在uri中被替换,我相信在我通过之后,接下来会发现数据没有作为帖子进入该方法。

这是我对fiddler响应的错误

{"Message":"No HTTP resource was found that matches the request URI 'http://127.0.0.1:82/api/v2/Bids/accept'.","MessageDetail":"No type was found that matches the controller named 'v2'."}

有人可以用正确的方法帮我解决这个问题吗?

此致 基兰

1 个答案:

答案 0 :(得分:0)

调用AcceptQuote()应该传递带参数的对象(而不仅仅是 quotedId 值)。正如in detail here所述,提取物:

  

可以使用以下参数调用类对象或实例对象上的操作方法:
   - 非GET“类”操作:Resource.action([parameters],postData,[success],[error])
  ...

所以这应该有效:

function acceptQuote(quoteId, data, fnSuccess, fnError) {
  return $resource("/api/v2/Bids/:quoteId/accept", { quoteId: "@id"},
        { "AcceptQuote": { method: "POST", isArray: false } })
        .AcceptQuote({ id : quoteId }, data, fnSuccess, fnError);

传递的第一个对象AcceptQuote()现在包含parameters对象,将搜索一个名为quoteId的属性,并将其注入到网址

要使用任何“数据”,使用ASP.NET Web API作为JSON传递,我们应该/必须创建一个对象/实体。所以,如果JSON就像:

{
  "MyProperty1" : "MyValue1",
  "MyProperty2" : "MyValue2",
}

然后是C#对象:

public class MyObject
{
   public string MyProperty1 { get; set; }
   public string MyProperty2 { get; set; }
}

Controller操作应该如下所示:

public HttpResponseMessage AcceptShipmentQuote(long quoteId, MyObject myObject)
{
    var prop1 = myObject.MyProperty1;
    var prop2 = myObject.MyProperty2;