Mvc,接收复杂对象。

网友方案非常不错: http://www.cnblogs.com/iceser/archive/2012/04/19/2457119.html

他分析了Mvc的映射过程进行扩展,而我是改造客户端提交行为。 

 

jQuery post 数组时,如  $.post("url", { values: [1,2,3] } )  ,默认:

values[]:1

values[]:2

values[]:3

 

改造后:

values[0]:1

values[1]:2

values[2]:3

 

个人认为这才能称之为数组,仅记录自己的蹩脚方案:

复制代码
jQuery.param = function (a, traditional) {

    var buildParams = function (prefix, obj, traditional, add) {
        if (jQuery.isArray(obj)) {
            // Serialize array item.
            jQuery.each(obj, function (i, v) {
                if (traditional || /\[\]$/.test(prefix)) {
                    // Treat each array item as a scalar.
                    add(prefix, v);

                } else {
                    // If array item is non-scalar (array or object), encode its
                    // numeric index to resolve deserialization ambiguity issues.
                    // Note that rack (as of 1.0.0) can't currently deserialize
                    // nested arrays properly, and attempting to do so may cause
                    // a server error. Possible fixes are to modify rack's
                    // deserialization algorithm or to provide an option or flag
                    // to force array serialization to be shallow.
                    buildParams(prefix + "[" + i + "]", v, traditional, add);
                }
            });

        } else if (!traditional && obj != null && typeof obj === "object") {
            // Serialize object item.
            for (var name in obj) {
                buildParams(prefix + "." + name, obj[name], traditional, add);
            }

        } else {
            // Serialize scalar item.
            add(prefix, obj);
        }
    };
复制代码

 

Mvc的 ModelBinder 也有一些问题,如映射到 StringBuilder 时不把它当做String对待。 对自定义类型,JavaScriptSerializer 和 Mvc , Wcf 都很乏力。

jQuery 的Post 不能直接提交数组,如:  $.post(url , [1,2]) 。 以下仅用 data 表示 Post 的数据。

jQuery改造后:

data = { query : [1,2] }            Form 信息  query[0]: 1  , query[1]: 2

data = { query: [ {a:1,b:2} , {a:3,b:4} ] }  Form信息  query[0].a : 1 , query[0].b : 2  , query[1].a : 3 , query[1].b : 4

data =  { query: { a : [1,2] } }         Form信息 query.a[0]: 1 , query.a[1]: 2

 

可以很清楚的表示对象,如果不另以改造,第二种情况,就无法以表示。 改造之后, 这三种都可以被 Mvc 正确接收。

 

posted @   NewSea  阅读(848)  评论(4编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示