无法从ajax帖子中获取控制器中的对象值。
我有一个jQuery数据表,其中第一列是复选框,我需要将所选的行ID返回给控制器。我可以得到所需的一切,但在控制器中始终为空。
Model:
public class Values
{
public Guid ID { get; set; }
}
View JS & Ajax on button click:
function SubAll() {
var values = [];
$('#timesheet').find('input[type="checkbox"]:checked').each(function (index, rowId) {
//this is the current checkbox
var temp = $(this).closest('tr').attr('id');
if (String(temp) === String("undefined")) {
//skip; it is the select all box
}
else {
//push to array
values.push(temp);
}
});
console.log(values);
var data = { ID: values };
console.log(data);
$.ajax({
url: "@Url.Action("ApproveAllTimesheets", "Admin")",
type: 'POST',
data: JSON.stringify(data),
dataType: 'json',
success: function (result) {
alert(result);
},
error: function (xhr, textStatus) {
if (xhr.status == 401) { alert("Session Expired!"); window.location = "/Account"; }
else {
alert('Content load failed!', "info");
}
}
});
};
Controller:
[HttpPost]
[ValidateAntiForgeryToken]
public void ApproveAllTimesheets(List<Values> value)
{}
如果选择了一个框(正常工作),则在按钮上单击“值”数组将填充ID,然后将其转换为对象“数据”以匹配方法签名和模型并进行字符串化。当在控制器方法上命中断点时,值将永远不会存在。我想念什么?
**UPDATE:**
function SubAll() {
var values = [];
$('#timesheet').find('input[type="checkbox"]:checked').each(function (index, rowId) {
//this is the current checkbox
var temp = $(this).closest('tr').attr('id');
if (String(temp) === String("undefined")) {
//skip; it is the select all box
}
else {
//push to array
values.push({ Id: temp });
}
});
console.log(values);
$.ajax({
url: "/Admin/ApproveAllTimesheets",
type: "POST",
data: values,
dataType: "html",
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
success: function (result) {
alert(result);
},
error: function (xhr, textStatus) {
if (xhr.status == 401) { alert("Session Expired!"); window.location = "/Account"; }
else {
alert('Content load failed!', "info");
}
}
});
};
**Method Signature:**
public IActionResult ApproveAllTimesheets( List<Value> values)
**Class**
public class Value
{
public Guid ID { get; set; }
}
更新#3
Model:
public class Value
{
public string TimeId { get; set; }
}
Ajax:
function SubAll() {
//var selectedValues = $('#timesheet').DataTable().column(0).checkboxes.selected().toArray();
var dataJSON = { TimeId: "test" };
console.log(dataJSON);
$.ajax({
url: "/Admin/ApproveAllTimesheets",
type: "POST",
contentType: "application/json; charset=utf-8",
dataType: "json",
data: JSON.stringify(dataJSON),
success: function (result) {
alert(result);
},
error: function (xhr, textStatus) {
if (xhr.status == 401) { alert("Session Expired!"); window.location = "/Account"; }
else {
alert('Content load failed!', "info");
}
}
});
};
Controller:
public ActionResult ApproveAllTimesheets([FromBody]Value information)
答案 0 :(得分:0)
如果这是您的JSON
{ <-- This here is the start of your object
"id": 1;
}
这需要绑定到模型
class AnyModel {
public int Id {get; set;}
}
如果您有JSON列表
{
[
...Some objects
]
}
您需要在控制器中接受一个模型
class AnyModel {
public List<SomeOtherModel> ListObject {get; set;}
}
更新
您想将“值”列表存储在另一个模型中。
class Value {
public Guid Id {get;set;}
}
class ValueContainer {
public List<Value> Values {get; set;}
}
现在,您要将JSON绑定到ValueContainer对象。发送JSON时,您需要[FromBody]
才能将JSON绑定到模型。
public IActionResult ApproveAllTimesheets([FromBody] ValueContainer values) {}
更新2
道歉,仔细研究一下您的JS代码(旧代码),您应该使用以下结构:
class ValueContainer {
public List<Guid> Id {get; set;}
}
List<Guid>
是您的values数组,您将其绑定到JSON对象中的id
。控制器保持不变。
public IActionResult ApproveAllTimesheets([FromBody] ValueContainer values) {}
答案 1 :(得分:0)
您应该像javascript普通对象一样插入ID:
values.push({
ID: "d88b44e4-1009-47d6-9f2f-f675dca89fe8",
});
以下代码供您参考:
function SubAll() {
var values = [];
values.push({
ID: "d88b44e4-1009-47d6-9f2f-f675dca89fe6",
});
values.push({
ID: "d88b44e4-1009-47d6-9f2f-f675dca89fe7",
});
values.push({
ID: "d88b44e4-1009-47d6-9f2f-f675dca89fe8",
});
$.ajax({
type: "POST",
url: "/Admin/ApproveAllTimesheets",
contentType: "application/json; charset=utf-8",
data: JSON.stringify(values),
success: function (result) {
alert(result);
},
error: function (xhr, textStatus) {
if (xhr.status == 401) { alert("Session Expired!"); window.location = "/Account"; }
else {
alert('Content load failed!', "info");
}
}
});
};
控制器:
public void ApproveAllTimesheets([FromBody]List<Values> value)
{
}
型号:
public class Values
{
public Guid ID { get; set; }
}
答案 2 :(得分:0)
所以我的Update#3正在运行,现在我遇到了另一个问题,因此我将为此发布一个新问题。