Проблема, по крайней мере частично, в том, что имена ваших свойств на клиенте не совпадают с именами ваших свойств на сервере. Например, на клиенте есть move_all, а на сервере - MoveAll. Чтобы привязка модели работала, они должны быть одинаковыми. Другая проблема в том, что типы данных также не совпадают. На клиенте move_all - это строка, тогда как на сервере MoveAll - это логическое значение. Не зная, как ваш клиентский код получает данные, трудно рекомендовать исправление для этого. Я думаю, что есть два подхода, которые вы могли бы использовать. Один из них - создать на сервере своего рода мостовую модель представления, которую вы используете для привязки данных. Затем вы должны скопировать данные из модели представления моста в ту, которая вам нужна, то есть в массив ItemPartViewModel
. Другой подход, который вы могли бы использовать, - это сопоставить ваш массив на клиенте с другим массивом объектов, который соответствует вашему ItemPartViewModel
.
Клиентский метод может быть реализован, например, путем изменения
item["p_id"] = p_id;
до
item["PartId"] = parseInt(p_id);
и для bools это будет работать
item["MoveAll"] = (move_all == "true");
таким образом, теперь свойство и тип соответствуют c# viewModel. Вам нужно будет сделать то же самое для всех свойств, чтобы все они совпадали.
Вот демонстрация рабочего кода, который, надеюсь, поможет вам
Просмотреть модели и контроллер
public class RawQtyActionTypeCloned
{
public string action_type { get; set; }
public string qty { get; set; }
}
public class RawItemPartViewModel
{
public string move_all { get; set; }
public string p_id { get; set; }
public RawQtyActionTypeCloned qty_actiontype_cloned { get; set; }
}
public class JODetailsController : Controller
{
public ActionResult SpecialOrderSelection()
{
return View();
}
[HttpPost]
public ActionResult SpecialOrderSelection(RawItemPartViewModel[] allParts)
{
return Content(allParts.Length.ToString());
}
}
Вид
<button id="myButton">
Click me
</button>
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<script>
var array = [{
move_all: "false",
p_id: "346",
qty_actiontype_cloned: [{
action_type: "Dispose",
qty: "1"
}]
}, {
move_all: "true",
p_id: "106",
qty_actiontype_cloned: [{
action_type: "Dispose",
qty: "2"
}]
},
{
move_all: "true",
p_id: "341",
qty_actiontype_cloned: [{
action_type: "Dispose",
qty: "3"
}]
}
];
$(document).ready(function () {
var myButton = document.getElementById("myButton");
myButton.addEventListener('click', onMyButtonClicked);
function onMyButtonClicked(e) {
e.preventDefault();
$.ajax({
type: "POST",
url: "/JODetails/SpecialOrderSelection",
contentType: "application/json; charset=utf-8",
data: JSON.stringify({ allParts: array }),
dataType: "json",
traditional: true
});
}
});
</script>
Обратите внимание, как совпадают имена и типы моих свойств.
Вот скриншот того, что я вижу на вкладке сети инструментов разработчика, когда смотрю на пост.
запросить полезную нагрузку
Изменить: в вашем ItemPartViewModel
измените
public QtyActionTypeOriginal QtyActionTypeOriginal { get; set; }
на
public QtyActionTypeOriginal[] QtyActionTypeOriginal { get; set; }
, потому что в клиенте это массив.