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,

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

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