Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过Ajax将从DataTable拾取的对象数组发送到控制器MVC错误400_C#_Ajax_Model View Controller_Datatables - Fatal编程技术网

C# 通过Ajax将从DataTable拾取的对象数组发送到控制器MVC错误400

C# 通过Ajax将从DataTable拾取的对象数组发送到控制器MVC错误400,c#,ajax,model-view-controller,datatables,C#,Ajax,Model View Controller,Datatables,第一次提问。 我目前正在尝试学习在MVC中使用Datatables。 我遇到的问题是,当我尝试将其发送到控制器时,出现错误400 我对Ajax很陌生,所以碰巧我有一个小pickle发送我在datatable中的信息。 我已经尝试了几种解决方案,但都无济于事,坦率地说,我不确定我做错了什么。 首先,我有一个从Datatable收集数据的javascript,并使用console.log将其变成一个对象数组 function insertOrUpdate() { var update

第一次提问。 我目前正在尝试学习在MVC中使用Datatables。 我遇到的问题是,当我尝试将其发送到控制器时,出现错误400

我对Ajax很陌生,所以碰巧我有一个小pickle发送我在datatable中的信息。 我已经尝试了几种解决方案,但都无济于事,坦率地说,我不确定我做错了什么。 首先,我有一个从Datatable收集数据的javascript,并使用console.log将其变成一个对象数组

function insertOrUpdate() {
        var update = [];


        $("#Table tbody tr").each(function () {
            var row = $(this);
            var Id = table.row(this).data()[4];
            var Designation = row.find("#txtDesignation").val();
            var TNumber = row.find("#txtTNumber").val();
            var OStorage = row.find("#txtOStorage").val();
            var SortNumber = row.find("TD").eq(0).text();
            var ObId = table.row(this).data()[5];

            update.push({
                Id: Id,
                Designation: Designation,
                TNumber: TNumber,
                OStorage: OStorage,
                SortNumber: SortNumber,
                ObId: ObId
            });
        });
我目前编写的Ajax如下所示:

var postData = {"Object": update };

        addAntiForgeryToken(postData);
        addAntiForgeryToken();
        $.ajax({
        cache: false,
            type: 'POST',
            url: '@Url.RouteUrl("UpdateOrInsert")',
            data: JSON.stringify(postData),
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',
            success: function (r) {
                alert(r + ' record(s) inserted.');
            },
            error: function (jqXHR, textStatus, errorThrown) {
                     alert('Cannot update');
                 },
                 failure: function () {
                     alert('Cannot update');
                 }
        });
        }
我在mvc的模型部分创建了一个模型,BaseAppEntityModel只是为可重用性定义了Id:

public partial class InsertUpdateModel : BaseAppEntityModel
    {
        public string Designation { get; set; }     

    public string TNumber { get; set; }

    public string OStorage { get; set; }

    public string SortNumber { get; set; }

    public string ObId { get; set; }
}
至于控制器本身,我尝试了几个版本:

[HttpPost]
        public JsonResult UpdateOrInsert(List<InsertUpdateModel> Object)
    {
        return Json(null);
    }
[HttpPost]
公共JsonResult UpdateOrInsert(列表对象)
{
返回Json(null);
}
我也尝试过:

[HttpPost]
        public void UpdateOrInsert(List<InsertUpdateModel> Object)
        {
            var t = Object;
        }
[HttpPost]
public void UpdateOrInsert(列表对象)
{
var t=对象;
}

public虚拟IActionResult UpdateOrInsert(列表对象)
{
返回Json(null);
}
如果有人有一点时间回答我的问题,我会非常感激,因为我似乎在这方面没有取得任何进展,即使我已经花了好几天的时间尝试不同的方法来实现它

编辑:为了澄清,我将添加另一个Ajax调用,我在同一个视图中使用了这个调用,效果非常好

    var Id;
    var obId = @Model.Id;
    var arrayId = new Array();

function confirmSelectedDelete() {
           let rows = table.rows('.selected');
           Id = table.cells(rows.nodes(), [4]).data();

           for (var i = 0; i < Id.length; i++) {

               arrayId.push(Id[i]);

           }

         function sendDeleteToController() {

             var postData = {"Id": arrayId, "ObId": obId };

             addAntiForgeryToken(postData);
             addAntiForgeryToken();
             $.ajax({
                 cache: false,
                 type: 'POST',
                 url: '@Url.RouteUrl("Delete")',
                 data: postData,
                 dataType: 'json',
                 success: function (data, textStatus, jqXHR) {
                     table.rows('.selected').remove().draw();
                 },
                 error: function (jqXHR, textStatus, errorThrown) {
                     alert('Cannot remove');
                 },
                 failure: function () {
                     alert('Cannot remove');
                 }
             });
         };
         sendDeleteToController();
         emptyArray();
    };
var-Id;
var obId=@Model.Id;
var arrayId=新数组();
函数confirmSelectedDelete(){
让rows=table.rows('.selected');
Id=table.cells(rows.nodes(),[4]).data();
对于(变量i=0;i
控制器具有:

        [HttpPost]
    public virtual IActionResult Delete(string[] Id, string ObId)
    {
        string obId = ObId.Trim();
        List<string> listId = new List<string>();
        foreach (var i in Id)
        {
            if (!StringHelper.AreNullOrEmpty(i))
                listId.Add(i.Trim());
        }
        if (listId.Count > 0)
            _service.Delete(listId, obId);

        return Json(null);
    }
[HttpPost]
公共虚拟IActionResult删除(字符串[]Id,字符串ObId)
{
字符串obId=obId.Trim();
List listId=新列表();
foreach(Id中的变量i)
{
如果(!StringHelper.AreNullOrEmpty(i))
添加(i.Trim());
}
如果(listId.Count>0)
_删除(listId,obId);
返回Json(null);
}

这个调用运行得非常好,但我不明白为什么第一个调用不起作用。

这是一个偶然事件,多亏了jdweng让我更仔细地回顾和反思我在解决方案中所使用的代码:

function loadAllInformation() {
        var update = [];

        $("#toolTable tbody tr").each(function () {
            var row = $(this);
            var Id = table.row(this).data()[4];
            var Designation = row.find("#txtDesignation").val();
            var TNumber = row.find("#txtTNumber").val();
            var ObStorage = row.find("#txtObStorage").val();
            var SortNumber = row.find("TD").eq(0).text();
            var ObId = table.row(this).data()[5];

            update.push({
                Id: Id,
                Designation: Designation,
                TNumber: TNumber,
                ObStorage: ObStorage,
                SortNumber: SortNumber,
                ObId: ObId
            });
        });
        function sendUpdateToController() {
            console.log(update);
            var postData = { "Object": update };
            addAntiForgeryToken(postData);
            addAntiForgeryToken();
            $.ajax({
                cache: false,
                type: 'POST',
                url: '@Url.RouteUrl("UpdateOrInsert")',
                data: postData,
                dataType: 'json',
                success: function (r) {
                    alert(r + ' record(s) inserted.');
                },
                error: function (jqXHR, textStatus, errorThrown) {
                    alert('Cannot update');
                },
                failure: function () {
                    alert('Cannot update');
                }
            });
        };
        sendUpdateToController();
        emptyArray();
    };
至于控制器,它是:

  [HttpPost]
    public JsonResult UpdateOrInsert(List<InsertUpdateModel> Object)
    {
        foreach(var item in Object)
        {
            Console.Write(item.Id);
        }

        return Json(null);
    }
[HttpPost]
公共JsonResult UpdateOrInsert(列表对象)
{
foreach(对象中的变量项)
{
Console.Write(item.Id);
}
返回Json(null);
}
foreach只是我确认信息实际上被推送到了控制器


至于模型,它和我的问题条目一样,希望这最终能帮助到别人

使用像wireshark或fiddler这样的嗅探器查看第一个请求。400是响应中的状态。一个好的回答是200行。我怀疑出现400是因为它是一个使用https的安全服务器,需要使用SSL/TLS的证书。如果我没有错误理解wireshark,它将从POST/updateorinsert http/1.1(应用程序/json)开始,响应为http/1.1 400 bad request。Http有两种模式:A)1.0流模式B)1.1块模式。我认为模式与问题无关。请求是非安全http(非https)。错误400表示语法错误。您必须查看请求中的标题,看看它们是否正确。如果您有另一个应用程序与同一服务器一起工作,请比较工作与非工作。http设置服务器可能不接受的默认标头。就像服务器只与Chrome一起工作一样,浏览器的默认标题是IE。浏览器是内容类型标题。我有另一个与同一服务器一起工作的调用,并且它位于同一视图中。谢谢你,jdweng,谢谢你的提问,这让我重新思考了我所做的事情,最后我成功地将信息发送给了控制员。
  [HttpPost]
    public JsonResult UpdateOrInsert(List<InsertUpdateModel> Object)
    {
        foreach(var item in Object)
        {
            Console.Write(item.Id);
        }

        return Json(null);
    }