0

我有一个这样的 js 对象构建:

    var entity = new Object();
    entity["1"] = Property1.GetValue();
    entity["2"] = Property2.GetValue();
    entity["3"] = Property3.GetValue();
    entity["4"] = Property4.GetValue();
    entity["5"] = Property5.GetValue();
    entity["6"] = Property6.GetValue();
    entity["7"] = Property7.GetValue();
    entity["8"] = Property8.GetValue();
    entity["9"] = Property9.GetValue();
    entity["10"] = Property10.GetValue();
    entity["11"] = Property11.GetValue();
    entity["12"] = Property12.GetValue();
    entity["13"] = Property13.GetValue();
    entity["14"] = Property14.GetValue();
    entity["15"] = Property15.GetValue();

我像这样发布它:

    var data = JSON.stringify(
    {
        entityID: 1,
        data: entity
    });
    $.ajax({ 
            type: "POST",
            url: "/Entity/Update",
            data: data, 
            contentType: "application/json", 
            traditional: true,
            success: function (data) { 
                alert("koko");
            },
            error:function (xhr, ajaxOptions, thrownError) { 
                alert(xhr.status); 
                alert(ajaxOptions); 
                alert(thrownError); 
            }
    }); 

帖子是,但 MVC 控制器为 data 参数获取了一个空参数。

MVC方法:

    public void Update(int entityID, IDictionary<string, object> data)

问题是值可以是不同的类型,而不仅仅是字符串或整数。那就是问题所在。有没有办法让默认模型绑定器正确读取对象,还是我必须编写自定义模型绑定器?

4

1 回答 1

0

我没有深入探讨为什么它在 MVC3 中不起作用(反序列化有问题?),但我在 MVC4 中检查了它——一切正常。

如果您无法切换到 MVC4,我的建议是重构您的data对象。我不知道您的示例与您的实际问题有多接近,但您可以使用数组而不是字典 - 在任何情况下,您的字典键都是索引...

所以以下将在 MVC3 中工作:

var entity = [
    Property1.GetValue(),
    Property2.GetValue(),
    Property3.GetValue(),
    Property4.GetValue()
];

public void Update(int entityID, List<object> data)

至于使用非原始类型作为PropertyN.GetValue()查看该文章的结果:http ://www.dalsoft.co.uk/blog/index.php/2012/01/10/asp-net-mvc-3-improved-jsonvalueproviderfactory -使用-json-net/

本文中的技术允许您将自定义 JSON 对象反序列化为dynamicC# 类型。因此,您的操作方法将具有以下签名:

public void Update(int entityID, IDictionary<string, dynamic> data)
于 2012-08-12T20:11:39.973 回答