【问题标题】:Some results are null when passing Dictionary<string, int[]> from JS to MVC controller将 Dictionary<string, int[]> 从 JS 传递到 MVC 控制器时,某些结果为空
【发布时间】:2018-03-18 12:12:07
【问题描述】:

我对此感到困惑,非常感谢您的帮助:

所以我有一个按钮,当您单击它时,它会调用函数 bulkUpdate

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

当我验证 js 中的值时,字典中的所有值都不为空,如下面的打印屏幕所示: 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);
        }
    }

【问题讨论】:

    标签: javascript c# asp.net-mvc dictionary hashmap


    【解决方案1】:

    我无法轻松验证此解决方案,但它似乎与数据如何从 AJAX 调用传递到控制器以及如何在控制器端反序列化有关。尝试在发送 dictionary 之前对其进行字符串化。

    更改 AJAX 调用中的 data 行,尝试几种方法...

    对齐字典:

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

    或者,整个 POST 正文:

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

    让我知道这是否适合你。

    【讨论】:

    • 我已经尝试过那个解决方案,它只向控制器返回了一个包含两个字符串的数组,一个是“action”,另一个是“controller”。不过,感谢您的回答
    • 您是否尝试将 [FromBody] 添加到您的参数定义中?所以你的方法签名将是 BulkUpdate([FromBody] Dictionary values).
    • 是的,仍然只出现“动作”和“控制器”i.stack.imgur.com/ieRP1.png
    • 唯一可行的方法是,如果我在以字母开头的 GUID 前添加一个数字,例如 newFoodID = "" + 0 + foodID ... 真的很奇怪不是吗
    • 嗯,是的很奇怪!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 2015-02-03
    • 1970-01-01
    相关资源
    最近更新 更多