【问题标题】:C# WebAPI - Calling POST Method Within Controller with Model as ParameterC# WebAPI - 使用模型作为参数在控制器内调用 POST 方法
【发布时间】:2015-08-28 13:58:51
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    尝试发送您的数据,例如

    data: dataToSend
    

    而不是

    data: JSON.stringify(dataToSend)
    

    如果这不起作用,您如何确保请求“不起作用”?你看到了什么反应?

    更新:

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

    { 'searchParameters': suppliedSearchParameters }
    

    但在您的操作中需要一个名为“param”的参数:

    public AccountSearchResultsDTO GetBatch([FromBody] AccountSearchDTO param)
    

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

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

    【讨论】:

    • 我试过你的建议;请参阅上面的$.ajax() 参数,但仍然没有成功。我收到以下错误消息:{"Message":"No HTTP resource was found that matches the request URI '[[URL]]/Account/GetBatch'.","MessageDetail":"No action was found on the controller 'Account' that matches the name 'GetBatch'."}
    • 感谢您的帮助;仍然是同样的错误。我的其他方法调用适用于同一个控制器,所以我不确定我做错了什么。
    【解决方案2】:

    [FromBody] 属性定义为action 参数会强制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;
    }
    

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

    例子:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多