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 @ 2012-08-14 10:47  NewSea  阅读(845)  评论(4编辑  收藏  举报