Javascript C#WebAPI-以模型为参数在控制器内调用POST方法

Javascript C#WebAPI-以模型为参数在控制器内调用POST方法,javascript,c#,asp.net-web-api,Javascript,C#,Asp.net Web Api,我不明白为什么下面对我的“GetBatch”webapi方法的调用不起作用。我不确定是否需要指定路由等。我确实有其他HttpPost方法,但请注意,我特别尝试调用我在下面定义的方法 我能做些什么来修复?URL应该是正确的,因为会调用不同的操作。谢谢你抽出时间 Javascript: var accountGetBatchURL = '@HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority)@Url.Content("~/

我不明白为什么下面对我的“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#账户控制员代码:

编辑:尝试对通过AJAX请求发送的dataToSend变量进行以下更改,但仍然出现“404”错误:


试着像这样发送数据

data: dataToSend
而不是

data: JSON.stringify(dataToSend)
如果这不起作用,您如何确保请求“不起作用”?您看到了什么响应

更新:

我还看到您正在构建数据,如:

{ 'searchParameters': suppliedSearchParameters }
但在操作中需要名为“param”的参数:

public AccountSearchResultsDTO GetBatch([FromBody] AccountSearchDTO param)
能否尝试将数据包装到名为param的属性中

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

[FromBody]
属性定义到action参数会强制WebAPI在将参数绑定到调用时读取简单类型。 见:

这不适用于您,因为您正在将类
AccountSearchDTO传递到

因此:

[HttpPost]
public AccountSearchResultsDTO GetBatch(AccountSearchDTO param)
{
    AccountSearchResultsDTO results = new AccountSearchResultsDTO();
    results.numOfRows = 0;
    return results;
}
只要您的URL指向正确的操作并且正确包装了数据,调用就应该可以工作

例如:

var data = { 'searchParameters': suppliedSearchParameters };

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

我尝试了您的建议;请参阅上面的
$.ajax()
参数,但仍然没有成功。我收到以下错误消息:
{“message”:“未找到与请求URI“[[URL]]/Account/GetBatch.”匹配的HTTP资源”,“MessageDetail”:“未在与名称“GetBatch.”匹配的控制器“Account”上找到任何操作。”
谢谢您的帮助;仍然是相同的错误。我的其他方法调用对同一控制器有效,因此我不确定我做错了什么。
var dataToSend = { 'param':  { 'searchParameters': suppliedSearchParameters } };
[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) + "}",
    ...
});