网友方案非常不错: 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 正确接收。