Passing A List Of Objects Into An MVC Controller Method Using jQuery Ajax

前端 未结 13 1729
逝去的感伤
逝去的感伤 2020-11-22 14:22

I\'m trying to pass an array of objects into an MVC controller method using jQuery\'s ajax() function. When I get into the PassThing() C# controller method, the argument \"t

13条回答
  •  [愿得一人]
    2020-11-22 14:45

    What I did when trying to send some data from several selected rows in DataTable to MVC action:

    HTML At the beginning of a page:

    @Html.AntiForgeryToken()
    

    (just a row is shown, bind from model):

     @foreach (var item in Model.ListOrderLines)
                    {
                        
                            @item.OrderId
                            @item.OrderDate
                            @item.RequestedDeliveryDate
                            @item.ProductName
                            @item.Ident
                            @item.CompanyName
                            @item.DepartmentName
                            @item.ProdAlias
                            @item.ProducerName
                            @item.ProductionInfo
                        
                    }
    

    Button which starts the JavaScript function:

     
    

    JavaScript function:

      function ProcessMultipleRows() {
                if ($(".dataTables_scrollBody>tr.selected").length > 0) {
                    var list = [];
                    $(".dataTables_scrollBody>tr.selected").each(function (e) {
                        var element = $(this);
                        var orderid = element.data("orderid");
                        var iscustom = element.data("iscustom");
                        var orderlineid = element.data("orderlineid");
                        var folderPath = "";
                        var fileName = "";
    
                        list.push({ orderId: orderid, isCustomOrderLine: iscustom, orderLineId: orderlineid, folderPath: folderPath, fileName : fileName});
                    });
    
                    $.ajax({
                        url: '@Url.Action("StartWorkflow","OrderLines")',
                        type: "post", //<------------- this is important
                        data: { model: list }, //<------------- this is important
                        beforeSend: function (xhr) {//<--- This is important
                          xhr.setRequestHeader("RequestVerificationToken",
                          $('input:hidden[name="__RequestVerificationToken"]').val());
                          showPreloader();
                        },
                        success: function (data) {
    
                        },
                        error: function (XMLHttpRequest, textStatus, errorThrown) {
    
                        },
                         complete: function () {
                             hidePreloader();
                        }
                    });
                }
            }
    

    MVC action:

    [HttpPost]
    [ValidateAntiForgeryToken] //<--- This is important
    public async Task StartWorkflow(IEnumerable model)
    

    And MODEL in C#:

    public class WorkflowModel
     {
            public int OrderId { get; set; }
            public int OrderLineId { get; set; }
            public bool IsCustomOrderLine { get; set; }
            public string FolderPath { get; set; }
            public string FileName { get; set; }
     }
    

    CONCLUSION:

    The reason for ERROR:

    "Failed to load resource: the server responded with a status of 400 (Bad Request)"
    

    Is attribute: [ValidateAntiForgeryToken] for the MVC action StartWorkflow

    Solution in Ajax call:

      beforeSend: function (xhr) {//<--- This is important
                          xhr.setRequestHeader("RequestVerificationToken",
                          $('input:hidden[name="__RequestVerificationToken"]').val());
                        },
    

    To send List of objects you need to form data like in example (populating list object) and:

    data: { model: list },

    type: "post",

提交回复
热议问题