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,
如果你主動命名了,他就會先匹配名稱,再匹配屬性
前后台數據交互這部分還是很多細節- -需要多加注意
