Asp.net MVC中的Model自動綁定功能,方便了我們對於request中的數據的處理, 從客戶端的請求數據,自動地以Action方法參數的形式呈現。有時候我們的Action方法中想要接收數組類型的參數,如何寫表單,使得Model能夠自動綁定到數組參數上呢?
看下面的代碼,Action方法UpdateStudents就需要IEnumerable<Student>類型的參數,用來批量更新Student數據。
[HttpPost] public ActionResult UpdateStudents(IEnumerable<Student> students) { //....save }
上面是一個非常典型的應用場景, 如何為表單中的field命名,能夠使得提交表單的時候,model bind能夠自動創建好IEnumerable<Student>類型的students呢?
下面就是在批量更新場景下的表單View代碼
@using(Html.BeginForm()) { for (var i = 0; i < Model.Count(); i++ ) { <div style="border-bottom: 1px solid red;"> <p>id:@Html.TextBoxFor(m => m[i].Id)</p> <p>name:@Html.TextBoxFor(m => m[i].Name)</p> <p>age:@Html.TextBoxFor(m => m[i].Age)</p> </div> } <input type ="submit"/> }
再來看看生成html的表單的實際效果
<form action="/home/updatestudents" method="post"> <div style="border-bottom: 1px solid red;"> <p>id:<input data-val="true" data-val-number="The field Id must be a number." data-val-required="The Id field is required." name="[0].Id" type="text" value="1" /></p> <p>name:<input name="[0].Name" type="text" value="Andrew Peters" /></p> <p>age:<input data-val="true" data-val-number="The field Age must be a number." data-val-required="The Age field is required." name="[0].Age" type="text" value="18" /></p> </div> <div style="border-bottom: 1px solid red;"> <p>id:<input data-val="true" data-val-number="The field Id must be a number." data-val-required="The Id field is required." name="[1].Id" type="text" value="2" /></p> <p>name:<input name="[1].Name" type="text" value="Brice Lambson" /></p> <p>age:<input data-val="true" data-val-number="The field Age must be a number." data-val-required="The Age field is required." name="[1].Age" type="text" value="29" /></p> </div> <div style="border-bottom: 1px solid red;"> <p>id:<input data-val="true" data-val-number="The field Id must be a number." data-val-required="The Id field is required." name="[2].Id" type="text" value="3" /></p> <p>name:<input name="[2].Name" type="text" value="Rowan Miller" /></p> <p>age:<input data-val="true" data-val-number="The field Age must be a number." data-val-required="The Age field is required." name="[2].Age" type="text" value="56" /></p> </div> <input type ="submit"/> </form>
可以看到對於集合數據的綁定,MVC中有自己的定義規則,所有的表單項都是[number].Field的形式。
上面是更新的例子,如果是批量添加數據,不能使用HtmlHelper,只要是提交的表單項按照這個規則來命名,MVC也能夠自動綁定成集合對象。
關於Model Bidning,這里還有一篇文章