【问题标题】:WepApi post parameters are nullWeb Api post 参数为空
【发布时间】:2013-05-31 05:15:40
【问题描述】:

我是 WebApi 的新手,收到的帖子参数有问题。 我想用从 webapi 控制器方法接收到的数据填充 jqgrid。

网格代码如下:

buildPostData: function (postData) {

            var parameters = {
                page: postData.page,
                rows: postData.rows,
                sidx: '',
                sord: '',
                _search: false,
                searchField: '',
                searchString: '',
                searchOper: '',
                filter: { groupOp: '', rules: [] }
            };

            $.extend(parameters, postData);

            var data = {
                parameters: parameters
            };

            return JSON.stringify(data);
        }

bindGridAllData: function () {

            var viewModel = this;

            jQuery("#AllDataGrid").jqGrid({
                url: 'api/DataApi/GetAllData',
                datatype: 'json',
                mtype: 'POST',
                ajaxGridOptions: {
                    contentType: 'application/json; charset=utf-8'
                },
                serializeGridData: viewModel.buildPostData,
                serializeRowData: function (data) {
                    return JSON.stringify(data);
                },
                jsonReader: { repeatitems: false, root: "d.rows", page: "d.page", total: "d.total", records: "d.records" },
                colNames: ['DataId', 'Title', 'Description', 'Date', 'UserId', 'Name', 'Surname', 'PicturePath', 'NumberOfComments', ''],
                colModel: [
                        { name: 'DataId', index: 'DataId', width: 10, hidden: true, editable: false, sortable: false, key: true },
                        { name: 'Title', index: 'Title', width: 10, editable: false, align: 'left', sortable: true, hidden: true },
                        { name: 'Description', index: 'Description', width: 10, editable: false, align: 'left', sortable: true, hidden: true },
                        { name: 'Date', index: 'Date', width: 10, editable: false, align: 'left', sortable: true, hidden: true },
                        { name: 'UserId', index: 'UserId', width: 10, editable: false, align: 'left', sortable: true, hidden: true },
                        { name: 'Name', index: 'Name', width: 10, editable: false, align: 'left', sortable: true, hidden: true },
                        { name: 'Surname', index: 'Surname', width: 10, editable: false, align: 'left', sortable: true, hidden: true },
                        { name: 'PicturePath', index: 'PicturePath', width: 10, editable: false, align: 'left', sortable: true, hidden: true },
                        { name: 'NumberOfComments', index: 'NumberOfComments', width: 10, editable: false, align: 'left', sortable: true, hidden: true },
                        {
                            name: 'DataInformation', index: 'DataInformation', width: 200, editable: false, align: 'left', sortable: true, formatter: function (cellvalue, options, rowObject) {
                                var template = $('<div data-bind="template: { name: \'DataRecord\', data: DataRecord, ajax: { async: false } }"></div>');
                                var data = { DataRecord: rowObject };
                                ko.applyBindings(data, template[0]);

                                return template.html();
                            }
                        }
                ],
                height: '100%',
                width: 900,
                pager: '#resultGridAllDataPager',
                rowNum: 10,
                rownumbers: false,
                scroll: false,
                sortname: 'Date',
                sortorder: "asc",
                gridview: true,
                hoverrows: false,
                viewrecords: true,
                cmTemplate: { title: false },
                loadComplete: function () {
                }
            });
        }

而WebApi方法是:

    [HttpPost]
    public JQGridData GetAllData(JQGridSearchParameters parameters)
    {
        using (dataMKbazaEntities context = new dataMKbazaEntities())
        {
            JQGridData grid = new JQGridData();

            var allData = context.ispolniSITEpodatoci().ToList();

            List<object> data = new List<object>();

            foreach (var ad in allData)
            {
                data.Add(new {
                    DataId=ad.podatokID,
                    Title=ad.naslov,
                    Description=ad.opis,
                    Date=ad.datum,
                    UserId=ad.idKORISNIK,
                    Name=ad.ime,
                    Surname=ad.prezime,
                    PicturePath=ad.slika,
                    NumberOfComments=ad.brojKOMENTARI
                });
            }

            grid.rows = data;
            grid.page = parameters.page;
            grid.records = data.Count;
            grid.total = (int)Math.Ceiling((float)data.Count / (float)parameters.rows);

            return grid;
        }
    }

发送数据时,参数具有从buildPostData 方法定义的值,但在 WepApi 控制器方法中接收时它们为空。

我在 webapi 方法中尝试了[FromBody],但没有成功。 http请求中的状态码是200 OK

【问题讨论】:

  • 为什么使用POST 获取数据? GET 不是正确的方式吗?
  • 是的,但我想使用 POST,因为我不希望发送的数据出现在查询字符串中
  • 抱歉,我认为buildPostData 函数的使用没有任何意义。为什么需要将要发送到GetAllData 的所有参数放在具有parameters 属性的对象内?为什么不直接使用return JSON.stringify(postData);?您没有包含JQGridSearchParameters 的定义,因此无法完整回答您的问题。无论如何,我建议您阅读the blog,其中描述了数据模型绑定和格式化程序的两种主要方式。
  • 我没有看到您在GetAllData 内部使用了parameters。我在服务器代码中看不到数据的排序、分页或过滤。也许您可以更好地使用loadonce: true

标签: jqgrid asp.net-web-api


【解决方案1】:

确保以下几点:

  1. 您的原始请求具有 Content-Type 标头。查看您的客户端代码,您似乎正在发送它,但只是想确保它确实是通过网络发送的。 Web API 有一个错误,如果您不发送 Content-Type 标头,因为我们不知道要反序列化哪个格式化程序,我们默认为 C# 类型的默认值。在这种情况下,它可能是“空”。此问题已在稍后修复,但尚未公开。

  2. 进行以下检查以查看任何模型状态错误:

    如果 (!ModelState.IsValid) { 抛出新的 HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.BadRequest, this.ModelState)); }

【讨论】:

    猜你喜欢
    • 2014-01-28
    • 1970-01-01
    • 2017-08-09
    • 2013-07-31
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    相关资源
    最近更新 更多