如何将json数据绑定到现有的viewmodel-mvc5

时间:2019-05-17 23:23:41

标签: c# json ajax asp.net-mvc asp.net-mvc-viewmodel

我有一个很长的强类型形式,它的输入与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)
    {

1 个答案:

答案 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);
    }        
});