我有一个很长的强类型形式,它的输入与viewmodel绑定为html助手,而我有一个不是强类型的表,它是在用户单击“添加”按钮时生成的,并且我将其数据收集为json。如何将json数据映射到viewmodel并作为一个单元发送以在ajax调用中的控制器中发布操作?
视图
@model SIServices.ViewModels.SODViewModel
@using (Html.BeginForm("Initiate", "SOD", FormMethod.Post, new { id =
"initiateSOD" })) // enctype = "multipart/form-data"
{
@Html.AntiForgeryToken()
...
@* form inputs as html helpers *@
@* html table data is collected as json *@
javasctipt
var cols = [];
cols.push("DIGITAL_FILE_TYPE_ID");
cols.push("DOCUMENT_LAPI_ID");
var DigitalMaps = [];
$("table#digital-map-table tbody tr").each(function () {
data = {};
var selectedDigitalMapVal = $(this).data("selectedDigitalMapVal");
data[cols[0]] = selectedDigitalMapVal;
var documentId = $(this).data("documentID");
data[cols[1]] = documentId.toString();
DigitalMaps.push(data);
data = {};
});
var headers = { __RequestVerificationToken:
$('input[name="__RequestVerificationToken"]').val() };
if (DigitalMaps != null) {
$.ajax({
headers: headers,
url: "@Url.Action("Initiate")",
type: "POST",
cache: false,
contentType: "application/json; charset=utf-8",
data: DigitalMaps,
dataType: "json",
success: function (succ) {
console.log(succ);
},
error: function (err) {
console.log(err.statusText);
}
});
}
viewmodel
namespace SIServices.ViewModels
{
public class SODViewModel
{
// a lot of properties - around 50
public int? DigitalMapId { get; set; }
public List<DIGITAL_MAPS> DigitalMaps { get; set; }
控制器
[HttpPost]
[ValidateHeaderAntiForgeryToken]
public ActionResult Initiate(SODViewModel vm)
{
答案 0 :(得分:0)
您已经获得了一个由视图模型支持的表单,您需要将其转换为JavaScript对象,以便可以附加DigitalMaps
数组。
要解决第一个问题,您可以在Convert form data to JavaScript object with jQuery这里使用其中一个答案。
下面,我从这里https://stackoverflow.com/a/22420377/2030565使用该函数。这项工作采用简单的形式,但我没有尝试查找边缘情况。
$.fn.serializeObject = function() {
var o = {};
var a = this.serializeArray();
$.each(a, function() {
if (o[this.name]) {
if (!o[this.name].push) {
o[this.name] = [o[this.name]];
}
o[this.name].push(this.value || '');
} else {
o[this.name] = this.value || '';
}
});
return o;
};
因此,我们可以捕获表单并将其转换为JavaScript对象:
var model = $("form").serializeObject();
现在,我们可以为集合附加属性:
var digitalMapRows = [];
model.DigitalMaps = digitalMapRows;
然后用ajax发布信息
$.ajax({
headers: headers,
url: "@Url.Action("Initiate")",
type: "POST",
cache: false,
contentType: "application/json; charset=utf-8",
data: JSON.stringify(model),
dataType: "json",
success: function (succ) {
console.log(succ);
}
});