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,

如果你主動命名了,他就會先匹配名稱,再匹配屬性

 

前后台數據交互這部分還是很多細節-  -需要多加注意


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM