【问题标题】:Web API string parameters and POST valuesWeb API 字符串参数和 POST 值
【发布时间】:2014-07-27 11:12:21
【问题描述】:

我正在使用一个 jQuery 插件,jTable。该插件具有以下加载表格的功能:

$('#PersonTable').jtable('load', { CityId: 2, Name: 'Halil' });

加载函数中的值作为 POST 数据发送。该插件还通过 URL 发送两个查询字符串参数(jtStartIndex、jtPageSize)用于分页。

文档中的示例显示了如何在 ASP.NET MVC 中处理此问题的函数,而不是在 Web API Example 中:

[HttpPost]
public JsonResult StudentListByFiter(string name = "", int cityId = 0, int jtStartIndex = 0, int jtPageSize = 0, string jtSorting = null)
{
    try
    {
        //Get data from database
        var studentCount = _repository.StudentRepository.GetStudentCountByFilter(name, cityId);
        var students = _repository.StudentRepository.GetStudentsByFilter(name, cityId, jtStartIndex, jtPageSize, jtSorting);

        //Return result to jTable
        return Json(new { Result = "OK", Records = students, TotalRecordCount = studentCount });
    }
    catch (Exception ex)
    {
        return Json(new { Result = "ERROR", Message = ex.Message });
    }
}

我的函数目前看起来如何:它工作正常,只是我无法读取 POST 数据(名称参数):

public dynamic ProductsList(string name = "", int jtStartIndex = 0, int jtPageSize = 0 )
{
    try
    {
        int count = db.Products.Count();
        var products = from a in db.Products where a.ProductName.Contains(name) select a;
        List<Product> prods = products.OrderBy(x => x.ProductID).ToList();
        return (new { Result = "OK", Records = prods, TotalRecordCount = count });
    }
    catch (Exception ex)
    {
        return (new { Result = "ERROR", Message = ex.Message });
    }
}

我的 jTable 加载:(当用户在输入中输入文本时会调用它)

$('#ProductTable').jtable('load', {
    name: $('#prodFilter').val()
});

对于如何读取 URL 中的字符串参数和 Web API 函数中的 POST 数据,我将不胜感激。


编辑: 我使用了另一种方法将数据发送到 API。我没有在格式为 JSON 的加载函数中发送它,而是使用 listAction 的函数并通过 URL 发送数据(有关详细信息,请参阅 jTable API 参考):

listAction: function (postData, jtParams) {
    return $.Deferred(function ($dfd) {
        $.ajax({
            url: 'http://localhost:53756/api/Product/ProductsList?jtStartIndex=' + jtParams.jtStartIndex + '&jtPageSize=' + jtParams.jtPageSize + '&name=' + $('#prodFilter').val(),
            type: 'POST',
            dataType: 'json',
            data: postData,
            success: function (data) {
                $dfd.resolve(data);
            },
            error: function () {
                $dfd.reject();
            }
        });
    });
}

根据过滤结果重新加载表格:

$('#ProductTable').jtable('load');

而不是这个:

$('#ProductTable').jtable('load', {
    name: $('#prodFilter').val()
});

【问题讨论】:

  • 请求是否命中服务器? jtStartIndex / jtPageSize 参数是否绑定?
  • 是的,我可以毫无问题地读取函数中的 jtStartIndex / jtPageSize 参数。只是名字我看不懂。

标签: javascript jquery json asp.net-web-api jquery-jtable


【解决方案1】:

尝试将[FromBody] 属性应用于名称参数

public dynamic GetProductList([FromBody]string name = "", int jtStartIndex = 0, jtPageSize = 0)
{
    ...
}

Web API 中的默认绑定器将在 URI 中查找字符串等简单类型,指定 FromBody 属性将强制它在正文中查找。

【讨论】:

  • 我刚刚将 [FromBody] 添加到 name 参数,但现在我得到: XMLHttpRequest cannot load ... No 'Access-Control-Allow-Origin' header is present... 在控制台中。我早些时候在所有电话中都遇到了这个问题,但设法用这个答案解决了这个问题:link。感谢您的帮助詹姆斯
  • @user2148965 这是一个单独的问题,这意味着您正在发布到不同的域。如果[FromBody] 解决了您的问题,那么您应该将此标记为其他用户的答案。
  • 如果我不清楚,我很抱歉。当我在我的名称参数之前添加 [FromBody] 时,我只会遇到“不存在‘Access-Control-Allow-Origin’标头”的问题。如果我删除它,它会 100% 与我在原始问题中添加的代码一起工作。我想知道为什么这会造成问题。
  • @user2148965 看不出为什么该属性会导致这种情况,该错误通常与对不同域进行 AJAX 调用有关
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-24
相关资源
最近更新 更多