Angularjs 在WebAPI2中,如何接受简单类型作为post参数以及路由参数

Angularjs 在WebAPI2中,如何接受简单类型作为post参数以及路由参数,angularjs,asp.net-web-api,Angularjs,Asp.net Web Api,大家好,经过一番努力,我终于克服了向服务器传递正确参数的障碍,但web api 2服务无法接受 下面是示例代码 [RoutePrefix("api/v2/bids")] public class BidsController : ApiController { [Route("{quoteId:long}/accept")] public HttpResponseMessage AcceptQuote(long quoteId,[FromBody] string remarks)

大家好,经过一番努力,我终于克服了向服务器传递正确参数的障碍,但web api 2服务无法接受

下面是示例代码

[RoutePrefix("api/v2/bids")]
public class BidsController : ApiController
{
    [Route("{quoteId:long}/accept")]
    public HttpResponseMessage AcceptQuote(long quoteId,[FromBody] string remarks)
    {
        HttpResponseMessage response;
            response = Request.CreateResponse(HttpStatusCode.Accepted, quoteId);
        return response;
    }
}
如果您注意到,我有route参数和sting类型的post参数。当我使用fiddler发布以下内容时:

POST http://127.0.0.1:81/api/v2/Bids/101/accept? HTTP/1.1
Authorization: Basic a2lyYW5AYWJjc2hpcHBlci5jb206a2lyYW5AYWJjc2hpcHBlci5jb20=
Accept: application/json, text/plain, */*
Content-Type: application/json;charset=utf-8
Referer: http://127.0.0.1:81/shipper/
Accept-Language: en-US
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0; EIE10;ENUSWOL)
Host: 127.0.0.1:81
Content-Length: 40
DNT: 1
Connection: Keep-Alive
Pragma: no-cache


{"remarks":"Accepting this as the best"}
或使用angularjs函数:

    function acceptQuote(quoteId, accept_remarks, fnSuccess, fnError) {

        return $resource("/api/v2/Bids/:id/accept", { quoteId: "@id"},
            { "AcceptQuote": { method: "POST", isArray: false } })
            .AcceptQuote({ id: quoteId }, { remarks: accept_remarks }, fnSuccess, fnError);
    }
返回以下错误:

{"Message":"The request is invalid.","ModelState":{"remarks":["Error reading string. Unexpected token: StartObject. Path '', line 1, position 1."]}}

我原以为使用
[FromBody]
就足以将简单类型作为post参数传递,任何想法都可以传递给我这里缺少的其他内容

[FromBody]的工作方式有点不同。请检查这个。如果您想获得字符串
[FromBody]字符串注释
,则您的正文必须如下所示:

"Accepting this as the best" 
不是JSON。另一方面,如果主体包含JSON,那么使用ASP.NET Web API最自然的方式就是通过实体/对象。所以,我们可以创建这个

public class MyObject
{
   public string remarks { get; set; }
}
控制器操作应如下所示:

[Route("{quoteId:long}/accept")]
public HttpResponseMessage AcceptQuote(long quoteId, MyObject myObject)
{
    var remarks = myObject.remarks;

再次感谢,你提供的链接对理解背景中发生的事情非常有帮助。