Ajax将模型作为JSON发送到控制器

时间:2015-06-24 13:46:05

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

我有一个模型,我试图通过Ajax调用从我的视图传递给我的控制器,该调用将模型和另一个数据字符串串联起来,如下所示:

SetBinConfig: function (model, range) {
    var _model = JSON.stringify(model);
    var rangeSplit = range.split(/[ -]+/);
    var _rangeSplit = JSON.stringify(rangeSplit);

    var data = "model=" +_model + "&rangeSplit=" + _rangeSplit;

    $.ajax({
        url: '/IdentifiConfig/DefaultConfiguration/SetBinConfiguration',
        type: 'POST',
        data: "{'data' : '" + data + "'}",
        dataType: 'json',
        contentType: 'application/json; charset=utf-8',
        cache: false,
        success: function (data) {
            if (data.error == 1) {
                cc.jqUtils.openDialog(data.ErrorDescription, 'Error', 'OK', null, null, null);
            }
        },
        error: function (x, h, r) {
            console.log(x, h, r);
        }
    });
},

然后通过这种方法收到:

public ActionResult SetBinConfiguration(string data)
{
        string range = data.Split(new string[] { "&rangeSplit=" }, StringSplitOptions.RemoveEmptyEntries)[1];
        string tempModelData = data.Split(new string[] {"&rangeSplit="}, StringSplitOptions.RemoveEmptyEntries)[0];
        string modelData = tempModelData.Replace("model=", "");

        DefaultConfigurationModel model = new JavaScriptSerializer().Deserialize<DefaultConfigurationModel>(modelData);

        string[] rangeSplit = Regex.Split(range, " - ");

        foreach (IdentifiBINConfiguration ibc in model.IdentifiBINConfigs)
        {
            if (ibc.LowerRange == rangeSplit[0] && ibc.UpperRange == rangeSplit[1])
            {
                model.IdentifiBINConfiguration = ibc;
                return Json(new { error = 0 });
            }
        }

        return Json(new { error = 1 });
}

然而,我收到此错误:

The value "System.Collections.Generic.Dictionary`2[System.String,System.Object]" is not of type "IdentifiMessenger.Implementations.Identifi.Object.IdentifiBINConfiguration" and cannot be used in this generic collection. Parameter name: value

我根本不知道这意味着什么。我知道字典是什么,但为什么我不能反序列化这个对象?我在这里跟着其他答案,我不明白为什么这不起作用。

编辑: Model字面意思是我的模型,从我的JS发送出来:

IdentifiConfig.SetBinConfig(@Html.Raw(Json.Encode(Model)), $('#BinRangesHidden').val());

range只是hidden的值。我没有回复我的模型,因为我只需要修改一个值,然后让页面稍后将该修改后的值拉下来。

1 个答案:

答案 0 :(得分:0)

您仍需要序列化数据。

data: JSON.stringify(data),

然后在你的控制器中,你的对象应该自动解析:

public ActionResult SetBinConfiguration(MyData data)

或者,您可以手动解析它:

public ActionResult SetBinConfiguration(string data)
{
    MyData resumeDto = JsonConvert.DeserializeObject<MyData>(data);
...