【问题标题】:How to pass route and post parameters to WebApi2 with route attribute from Angularjs如何使用来自Angularjs的路由属性将路由和发布参数传递给WebApi2
【发布时间】:2013-12-25 04:07:29
【问题描述】:

我正在尝试将我的 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;
    }
}

在 Angular 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 中被替换,我确信在我通过之后,接下来会发现 data 没有以 post 的形式进入该方法。

这是我在提琴手响应时​​遇到的错误

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

有人可以帮我找出正确的方法来让它工作吗?

问候 基兰

【问题讨论】:

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


    【解决方案1】:

    调用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 的属性,并将其注入到url 中

    要使用 ASP.NET Web API 以 JSON 形式传递的任何“数据”,我们应该/必须创建一个对象/实体。所以如果 JSON 是这样的:

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

    然后是C#对象:

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

    控制器动作应该是这样的:

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

    【讨论】:

    • 我试过了,但它现在生成了一个错误的 uri,就像 http://127.0.0.1:82/api/v2/Bids/accept?quotedId=101 但我期待 http://127.0.0.1:82/api/v2/Bids/101/accept 这可能吗?
    • 我更新了我的答案。我将@quotedId 重命名为@id。这个语法就是说 Angular:搜索一个名为 id 的属性。然后应该注入 Ths 来代替 :quoteId。请检查拼写,确保名称中没有错误。这就是为什么 Angular 没有找到该参数并将其作为查询字符串参数附加到末尾的原因
    • 谢谢,必须做一点小改动,必须将/api/v2/Bids/:quoteId/accept 更改为/api/v2/Bids/:id/accept 现在我看到uri 中的参数更新了,但是webapi 仍然无法接受post 参数,不确定在哪里将其定义为参数。
    • 感谢您的帮助,我将关闭此线程并针对 Webapi 问题启动另一个线程,因为在我看来,通过在 post 参数中传递简单类型,这是一个完全不同的问题。
    • Angular 和 Web API ...不错的选择 ;) 我也这样做了。我会说,你很亲密。 Just Web API 旨在将请求正文中的数据/JSON 转换为对象。框架将为我们解除序列化。我们仍然可以进入该过程,例如有一些属性...
    猜你喜欢
    • 1970-01-01
    • 2014-01-12
    • 2016-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    相关资源
    最近更新 更多