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