zoukankan      html  css  js  c++  java
  • Asp.net MVC 模型绑定接收——ajax提交对象、数组


    controller中模型绑定这一方面一直都是糊里糊涂,尤其是前台通过ajax传递对象或者数组的时候,这一次又遇到了问题,这里记录一下:


    一、首先是传递数组

    1、Form提交

    页面如果是表单提交 这个比较简单 只要把元素的name属性设置一致,在controller中就会自动获得数组并绑定

    <form action="Test" method="post">
            <input name="arr" value="1" />
            <input name="arr" value="2" />
            <input name="arr" value="3" />
            <input type="submit" value="提交" />
        </form>

    controller:

    public ActionResult Test(string[] arr)
            {
           var form=Request.Form;
    return View(arr); }

    这里查看form就可以发现,form有一个key为arr(页面中提交的元素的name值),然后值为1,2,3, Action Test的参数arr就会自动被绑定为[1,2,3]

    2、ajax提交数组

      
        $(function () {
            $("#div button#btnSub").click(function () {
                arr = [];
                arr[0] = 1;
                arr[1] = 2;
                arr[2] = 3;
                var str = arr.toString();
                $.ajax({
                    url: 'test',
                    type: 'post',
                    //data: {arr:arr},
                    data: arr,
                    success: function (data) {
                        alert("data");
                    }
                });
            });
    })

    这里,直接新建一个数组为arr ,然后使用ajax传递,就可以了 ,这里注意:data:arr,和data:{arr:arr},都可以成功提交,但是如果用了第二种方式写法,那么name必须和controller中的一致,否则无法绑定成功

    二、对象提交

    最开始我是这么写的:

    $(function () {
            $("#div button#btnSub").click(function () {
                obj = new Array();
                obj["qx"] = "千寻";
                obj["bl"] = "白龙";
                $.ajax({
                    url: 'test',
                    type: 'post',
                    data: obj,
                    success: function (data) {
                        alert("data");
                    }
                });
            });
    })

    在controller中是这么写的

    [HttpPost]
            public ActionResult test(Model model) //或者( string[]  arr)
            {
                //var form=Request.Form;
                //var route = RouteData.Values;
                //var query = Request.QueryString;
                return View();
            }
    
            public class Model {
                public string qx { get; set; }
    
                public string bl { get; set; }
            }

    但是,就是绑定不了- -   

    后来经过调试发现,虽然 arr被定义为 new Array(),但是通过arr["key"]=value;这种写法赋值之后,其实他已经是无法像正常数组(arr[0])一样了 ,

    其实它是一个对象了,哎,反正不太明白这里- -还是稀里糊涂,所以干脆我就定义成 arr={};然后其他都没变,就成功了- - - -

    $(function () {
            $("#div button#btnSub").click(function () {
                obj = {};
                obj["qx"] = "千寻";
                obj["bl"] = "白龙";
                $.ajax({
                    url: 'test',
                    type: 'post',
                    data: obj,
                    success: function (data) {
                        alert("data");
                    }
                });
            });
    })

    这里同样注意,如果主动提供name,那么就一定要跟controller参数名一致,如果不主动命名,

    直接写data:obj,这样的话是不用注意名称的,叫啥都行,也不用跟后台参数一样

    这是因为MVC的模型绑定机制,它是先检测类型,然后就去匹配对象的属性值,也就是model.xx,

    如果你主动命名了,他就会先匹配名称,再匹配属性

    前后台数据交互这部分还是很多细节-  -需要多加注意

  • 相关阅读:
    Eclipse Alt + / 无提示
    洛谷 P1101 单词方阵
    力扣题解 7th 整数反转
    力扣题解 344th 反转字符串
    力扣题解 48th 旋转图像
    力扣题解 36th 有效的数独
    力扣题解 1th 两数之和
    力扣题解 283th 移动零
    力扣题解 66th 加一
    力扣题解 350th 两个数组的交集 II
  • 原文地址:https://www.cnblogs.com/4job/p/11211383.html
Copyright © 2011-2022 走看看