Параметр нулевой строки плагина DataTableEditor на контроллере - PullRequest
0 голосов
/ 11 июля 2019

Утро, я уже некоторое время работаю над этой проблемой и не могу понять, какие настройки у меня не так с этим кодом. Намерение состоит в том, чтобы иметь сетку (DataTable) и разрешить редактирование этих данных в строке (редактор). У меня есть данные, получающие данные от одного вызова ajax, и редактор использует другой для обновления записи. Исходный ajax в порядке и заполняется правильно, но когда я запускаю обновление, параметр, который я отправляю, равен нулю. Вот некоторый код:

    <div>
      <table id="post-table" class="table table-striped" style="width:100%">
        <thead>
           <tr role="row">
               <th>postID</th><th></th><th></th><th></th><th></th>
           </tr>
        </thead>
        <tbody></tbody>
     </table>
   </div>

    <script src="~/Content/DataTables-1.10.18/js/jquery.dataTables.js"></script>
    <script src="~/Content/editor-1.9.0/js/dataTables.editor.js"></script>

    <link rel="stylesheet" type="text/css" href="~/Content/DataTables-1.10.18/css/jquery.dataTables.css">

     <script language="javascript" type="text/javascript">
        var editor;

        editor = new $.fn.dataTable.Editor(
        {
           ajax: {
              edit: {
                 type: "POST",
                 url: "/ActivationCampaign/UpdatePostRecord",
                 dataType: "json",
                 contentType: "application/json",
                                    data: function (data) {

                                        var obj = data.data;
                                        var key = Object.keys(obj)[0];

                                        var theJson = {};
                                        theJson["campaignVersionID"] = @ViewBag.CampaignID;
                                        theJson["salesChannelID"] = @ViewBag.SalesChannel;
                                        theJson["postID"] = key;
                                        theJson['amount'] = obj[key].amount;

                                        return JSON.stringify(theJson);
                                    }
                                }
                            },
                            table: "#post-table",
                            idSrc: "postID",
                            fields: [{
                                label: "",
                                name: "amount"
                            }]
                        }),

                        $(document).ready(function () {
                            $('#post-table').DataTable({
                                "ajax": {
                                    "url": "/ActivationCampaign/LowLevelBudgetsForChannel?campaignID=@ViewBag.CampaignID&SalesChannelID=@ViewBag.SalesChannel",
                                    "type": "GET",
                                    "datatype": "json",
                                    "dataSrc": ''
                                },
                                "pagingType": "simple",
                                "columnDefs": [
                                    {"targets": [0], "visible": false, "searchable": false, "title": "post-id"},
                                    {"targets": [1], "title": "Post" },
                                    {"targets": [2], "title": "Post Number"},
                                    {"targets": [3], "title": "Allocated Amount", "className": "allocated-column editable"},
                                    {"targets": [4], "title": "Consumed Amount"}
                                ],
                                "columns": [
                                    { "data": "postID" },
                                    { "data": "postName"},
                                    { "data": "postNumber" },
                                    { "data": "amount" },
                                    { "data": "formatedAmount" },
                                ],
                                "initComplete": function (settings, json)
                                {
                                    populateConsumed();
                                }
                            });
                        },

                        $('#post-table').on('click', 'tbody td:not(:first-child)', function (e)
                        {
                            editor.inline(this);
                        }));//end of doc ready

                        function populateConsumed()
                        {
                            var totalAmount = 0;

                            $(".allocated-column").each(function () {

                                var values = $(this).text().replace(',', '');
                                if (values > 0)
                                {
                                    totalAmount += parseFloat(values);
                                }
                            });

                            $('#txtchangeBudget').val(JSON.stringify(totalAmount).replace(/\B(?=(\d{3})+(?!\d))/g, ","));
                        }
                    </script>




                    </div>

И действия:

[System.Web.Mvc.HttpGet]
    public JsonResult LowLevelBudgetsForChannel(int campaignID, int salesChannelID)
    {//TODO get defensive on the parameters
        return Json(activationCampaignService.GetLowLevelBudgetsForChannel(
            campaignID, salesChannelID),
            JsonRequestBehavior.AllowGet
        );
    }        

    [System.Web.Http.HttpPost]
    public JsonResult UpdatePostRecord([FromBody]string budgetRecord)
    {
        if(budgetRecord == null)
        {

        }

        return Json("hello");
        //return Json(activationCampaignService.UpdatePostRecord(budgetRecord));
    }

Вызов LowLevelBudgetsForChannel работает нормально, но UpdatePostRecord всегда имеет нулевое значение в budgetRecord. Обратите внимание, что атрибут HttpPost происходит из пакета, отличного от другого, но я только что изменил его, но я обеспокоен тем, что теперь у меня установлены оба System.Net.Http и System.Web.Http, кто-нибудь знает о каких-либо проблемах, которые могут вызвать.

Поскольку мне нужно создать json для отправки, а отправляемые данные представляют собой данные в более чем одной таблице, я бы предпочел отправить строку и обработать ее в действии. IE отладчик в данный момент показывает, что думает, что я отправляю следующее:

{"campaignVersionID":186,"salesChannelID":45,"postID":"20","amount":"1001"}

Я попал в устаревшую систему здесь, и в этом есть много ошибок, но я не верю, что это как-то связано с этим, и я просто не настроил это правильно. Первоначально у меня не был правильно установлен тип содержимого или типы данных или атрибут from body, но следование этому совету не решило мою проблему. Любой совет по этому поводу?

[править] В настоящее время я думаю, что это связано с сериализацией, которая происходит, поскольку у меня есть Fiddler, а значения отправляются в теле запроса.

1 Ответ

0 голосов
/ 11 июля 2019

В конце концов мне нужно было создать тип, который соответствовал бы структуре javascript, который я отправлял, и все это было правильно заполнено.Так что наверное была какая-то ошибка сериализации под капотом где-то.У кого-нибудь есть причина, по которой строка не может быть связана таким образом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...