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,
如果你主动命名了,他就会先匹配名称,再匹配属性
前后台数据交互这部分还是很多细节- -需要多加注意