一些结果是空路过字典当<字符串,INT []>从JS到MVC控制器

问题描述:

我为此感到困惑,帮助将是非常赞赏:一些结果是空路过字典当<字符串,INT []>从JS到MVC控制器

所以我有一个按钮,当你点击它它会调用函数bulkUpdate

我创建了一个字典在该js函数与格式:1键和2个值。

当我验证JS的值,ALL在字典中的值不为空,你可以通过以下PRINTSCREEN看到: the dictionary in javascript

然而,当它通过一个Ajax调用达到控制器,一些的值为空。我注意到这只发生在以字母而不是数字开头的键上。 the dictionary in the controller

有人知道为什么发生这种情况,我该如何解决它?

JS:

function bulkUpdate(e, id){ 

    var dictionary = {}; 

    var el = $("#grid"+id), 
     grid = el.data("kendoGrid"), 
     dataSource = grid.dataSource; 

    var data = grid._data; 

    for(i=0; i<data.length; i++){ 
     var foodID = grid._data[i].ID; 
     var extraQuantityBoxe = $("#extraAmmount" + foodID).val(); 
     var takeStorageBoxe = $("#takeFromStorage" + foodID).val(); 

     dictionary[foodID] = new Array(); 
     dictionary[foodID].push(extraQuantityBoxe); 
     dictionary[foodID].push(takeStorageBoxe); 
    } 

    $.ajax({ 
     type: "POST", 
     url: 'BulkUpdate', 
     data: {values : dictionary}, 
     success: function (data) { 
      $("#grid"+id').data('kendoGrid').dataSource.read(); 
     }, 
     error: function() { 
      var notification = $("#notification").getKendoNotification(); 
      var notificationBaseHeight = 100, notificationLineHeight = 25; 
      notification.show({ 
       message: '@Resources.warnGenericError' 
      }, "error"); 
     } 
    }); 
} 

控制器:

public ActionResult BulkUpdate(Dictionary<string, int[]> values) 
    { 
     try 
     { 
      foreach (KeyValuePair<string, int[]> pair in values) 
      { 
       string key = pair.Key; 
       int[] value = pair.Value; 

       Guid foodID= new Guid(key); 

       FOODS food = _db.FOODS.Find(foodID); 
       food.INGREDIENT_EXTRA_QUANTITY = value[0]; 
       food.TAKE_FROM_STORAGE = value[1]; 
       food.INGREDIENT_TOTAL_QUANTITY = food.INGREDIENT_QUANTITY + value[0] + value[1]; 
       food.UPDATED_AT = DateTime.Now; 
       food.UPDATED_BY = System.Web.HttpContext.Current.Session["username"].ToString(); 
      } 

      _db.SaveChanges(); 

      return Json(true); 
     } 
     catch (Exception e) 
     { 
      return Json(false, e.Message); 
     } 
    } 

我不能够很容易地验证这一点的解决方案,但它似乎相关的数据是如何被传递到从AJAX控制器调用,然后如何在控制器端进行反序列化。尝试在发送之前将字典串联起来。

更改数据线在你的AJAX调用,尝试它一对夫妇的方式...

只是字符串化字典:

data: {values : JSON.stringify(dictionary)} 

或者,整个POST正文:

data: JSON.stringify({values : dictionary}) 

让我知道,如果这对你有用。

+1

我已经试过这个解决方案,它只返回给控制器一个数组,两个字符串,一个说“动作”,另一个说“控制器”。尽管如此,感谢您回答 – Rute

+0

您是否尝试将[FromBody]添加到您的参数定义中?所以你的方法签名是BulkUpdate([FromBody] Dictionary values)。 –

+0

是的,仍然只出现“动作”和“控制器” https://i.stack.imgur.com/ieRP1.png – Rute