zoukankan      html  css  js  c++  java
  • 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 正确接收。

    alarm   作者:NewSea     出处:http://newsea.cnblogs.com/    QQ,MSN:iamnewsea@hotmail.com

      如无特别标记说明,均为NewSea原创,版权私有,翻载必纠。欢迎交流,转载,但要在页面明显位置给出原文连接。谢谢。
  • 相关阅读:
    Python排序算法(一)——快速排序
    jupyter运行py文件(py文件和ipynb文件互转)
    Jupyter notebook工具栏隐藏和jupyter notebook主题更改
    Python中print和return的区别
    500 : Internal Server Error(jupyter)
    PEP8 python规范神器
    Python分析微信好友性别比例和省份城市分布比例
    xpath 的使用
    scrapy实验1 爬取中国人寿官网新闻,保存为xml
    数据可视化matplotlib、seaborn、pydotplus
  • 原文地址:https://www.cnblogs.com/newsea/p/2637633.html
Copyright © 2011-2022 走看看