【问题标题】:WebApi dynamic object not bindingWebApi 动态对象未绑定
【发布时间】:2013-11-01 19:27:23
【问题描述】:

我正在尝试将dynamic object 发送到ApiController。在return null 行上设置断点,我看到parameters 始终是null

AJAX 电话:

$(':checkbox').click(function (event) {
    var values = $('input[type="checkbox"]:checked').map(function () {
        return $(this).val();
    }).toArray();

    var product = {
        Name: $('#name2').val(),
        Price: $('#price2').val(),
        Category: $('#category2').val()
    };

    $.ajax({
        type: 'GET',
        url: '/api/filter',
        data: JSON.stringify( product ),
        contentType: 'application/json',

        success: function (data) {
            //alert("succeeded");
        },
        error: function (err, data) {
            alert("Error " + err.responseText);
        }
    });

});

Controller:

[HttpGet]
public IEnumerable<Products> GetAllProducts(dynamic parameters)
{
    return null;
}

知道我在这里做错了什么吗?

【问题讨论】:

  • 我认为 JSON 中需要有一些内容表明您传递的对象被命名为 parameters,这样自动的东西才能按照您的预期工作。
  • 也许JSON.stringify( { parameters: product } ) 会给你一些东西。
  • @TimS。我也试过了,还是null。
  • 在回答您下面的其他问题时,GET 请求不假定有正文,只有 URL 参数,因此不会尝试对正文进行绑定。
  • @TrueBlueAussie,你说的“没有假设有身体”是什么意思?

标签: c# jquery asp.net-web-api dynamicobject


【解决方案1】:

编辑:- 将原始答案从 GET 更改为 POST。

假设你发布的代码在FilterController中,GetAll方法一般不带参数,用于获取所有产品。如果你想在那里填充你的动态,你应该将它更改为像这样的 POST..

$.ajax({
        type: 'POST',
        url: '/api/filter/GetAllProducts,
        data: JSON.stringify( product ),
        contentType: 'application/json',

        success: function (data) {
            //alert("succeeded");
        },
        error: function (err, data) {
            alert("Error " + err.responseText);
        }
    });

然后用 HttpPost 属性装饰你的控制器

[HttpPost]
public IEnumerable<Products> GetAllProducts(dynamic parameters)
{
    return null;
}

【讨论】:

  • 我也试过你的选择,它仍然是空的。 GetAll 是对的,但这只是在 dynamic object 中获取一些数据的测试。
  • 嗯...这很奇怪,帖子确实有效。但是为什么 GET 调用不起作用?
  • 这段代码和我们使用的差不多。在 ajax 调用之前放置一个断点并检查 JSON.stringify( product ) 是否发布了 null。
  • 我的猜测可能与 WebAPI 中的默认模型绑定器有关,以及 GET 在 url 中具有参数和 POST 将其作为正文的一部分之间的区别。如果你想保留是一个 GET,您应该考虑简单地返回一个 IQueryable 并使用 oData $filter $where 等运算符并使其成为 oData 端点
  • 您是否有关于这些 oData $filter $where 等的链接(指向教程或其他内容)?
猜你喜欢
  • 1970-01-01
  • 2013-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-13
  • 2013-11-26
  • 2019-04-13
  • 2011-02-11
相关资源
最近更新 更多