C#WebAPI - 以模型为参数调用控制器中的POST方法

时间:2015-08-28 13:58:52

标签: javascript c# asp.net-web-api

我无法弄清楚为什么以下调用我的" GetBatch" webapi方法不起作用。我不确定是否需要指定路由等。我确实有其他HttpPost方法,但请注意我特意尝试调用我在下面定义的方法。

我该怎么办? URL应该是正确的,因为会调用不同的操作。谢谢你的时间。

使用Javascript:

var accountGetBatchURL = '@HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority)@Url.Content("~/")api/Account/GetBatch';

function () {
    'use strict';
    var lastColumns = oTable.context[0].aoColumns;
    var lastSearch = oTable.context[0].aoPreSearchCols;
    var suppliedSearchParameters = new Array();
    for (var i = 0; i < lastSearch.length; ++i) {
        if (lastSearch[i].sSearch !== "") {
            suppliedSearchParameters.push({ "column": lastColumns[i].mData, "value": lastSearch[i].sSearch });
        }
    }
    var dataToSend = { 'searchParameters': suppliedSearchParameters };
    $.ajax({
        url: accountGetBatchURL,
        type: 'POST',
        cache: false,
        contentType: 'application/json',
        dataType: 'json',
        data: JSON.stringify(dataToSend),
        error: function (jqXHR, textStatus, errorThrown) {
            bootbox.alert("There was a problem with sending the search parameters to the service for processing. Extended information: Error Number: " + textStatus + " Error Thrown: " + errorThrown);
        },
        success: function (json) {
            bootbox.alert("Successfully sent search parameters to LMS Search service!")
        }
    });
}

C#型号代码:

public class AccountSearchDTO
{
    public AccountSearchParameterDTO[] searchParameters { get; set; }
}

public class AccountSearchParameterDTO
{
    public string column { get; set; }
    public string value { get; set; }
}

public class AccountSearchResultsDTO
{
    public int numOfRows { get; set; }
}

C#帐户控制器代码&#34;:

[HttpPost]
public AccountSearchResultsDTO GetBatch([FromBody] AccountSearchDTO param)
{
    AccountSearchResultsDTO results = new AccountSearchResultsDTO();
    results.numOfRows = 0;
    return results;
}

编辑:尝试对我的dataToSend变量进行以下更改,该变量是通过我的AJAX请求发送的,但我仍然得到了#34; 404&#34;错误:

var dataToSend = { 'param': { 'searchParameters': suppliedSearchParameters} };

2 个答案:

答案 0 :(得分:0)

尝试发送您的数据,如

data: dataToSend

而不是

data: JSON.stringify(dataToSend)

如果这不起作用,您如何确保请求&#34;不起作用?#34;?您看到了什么回应?

<强>更新

此外,我发现您构建的数据如下:

{ 'searchParameters': suppliedSearchParameters }

但希望参数名为&#34; param&#34;在你的行动中:

public AccountSearchResultsDTO GetBatch([FromBody] AccountSearchDTO param)

您可以尝试将数据包装在名为param的属性中吗?

var dataToSend = { 'param':  { 'searchParameters': suppliedSearchParameters } };

答案 1 :(得分:0)

为action参数定义[FromBody]属性会强制WebAPI在将参数绑定到调用时读取简单类型。 请参阅:http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

这不适合您,因为您正在通过课程AccountSearchDTO

因此:

[HttpPost]
public AccountSearchResultsDTO GetBatch(AccountSearchDTO param)
{
    AccountSearchResultsDTO results = new AccountSearchResultsDTO();
    results.numOfRows = 0;
    return results;
}

只要您的网址指向正确的操作并且您正确包装数据,该调用就可以正常工作。

示例:

var data = { 'searchParameters': suppliedSearchParameters };

$.ajax({
    url: accountGetBatchURL,
    type: 'POST',
    contentType: 'application/json',
    dataType: 'json',
    data: "{ param:" + JSON.stringify(data) + "}",
    ...
});