我有一个模型,我正在使用ajax.post。我可以看到模型绑定不是为我的模型中的arraylists完成的,虽然为int或string类型的属性进行了绑定。为什么会这样?我的代码如下。
我有一个具有以下属性的模型
public class ProjectModel
{
public int ID { get; set; }
public ArrayList Boys= new ArrayList();
}
在我看来,我有
$(document).ready(function () {
var project = new Object();
var Boys= new Array();
var ID;
.......
ID = $('#ID').val();
project.Boys= Boys;
.....
$.ajax({
type: "POST",
url: '<%=Url.Action("Create","Project") %>',
data: JSON.stringify(project),
contentType: "application/json; charset=utf-8",
dataType: "html",
success: function () {
},
error: function (request, status, error) {
}
});
//
我的控制器
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(ProjectModel project)
{
try
{
project.CreateProject();
return RedirectToAction("Index");
}
...
答案 0 :(得分:1)
使用名称完成ModelBinding。 对于要绑定的任何Collection,它必须具有以下格式:
project.property1
project.property2
和男孩收藏
project.Boys[0].property1
project.Boys[0].property2
project.Boys[1].property1
project.Boys[1].property2
如果您正在使用表单,则可以正确设置输入的名称并使用jquery:
//inside the ajax definition
data: $('#formID').serialize(),
编辑:如果男孩没有属性,则名称应为:
project.Boys[0]
project.Boys[1]
project.Boys[2]
您是否尝试使用这样的第二个参数进行绑定?
public ActionResult Create(ProjectModel project, string[] Boys)
我没有使用ArratList
,因为我做了一些测试,它似乎根本没有绑定,我更喜欢使用普通的数组声明。
您可以尝试的另一件事是检查FormCollection
public ActionResult Create(FormCollection f)
在开头放置断点并检查值,如果里面的名称不遵循格式项目。它永远不会绑定。
EDIT2 :如果要绑定到多个数组,只需将一个集合定义添加到模型中:
public class ProjectModel
{
public IEnumerable<string[]> Boys { get; set; }
}
名称应为: 对于第一个数组:
project.Boys[0]
project.Boys[0]
第二个:
project.Boys[1]
project.Boys[1]
。 。
但是为了归档这个,Javascript中Boys的定义也应该是一个colecction的集合,我不知道如何在js中定义它。
PD:如果您手动将值推送到数组,并且这些值来自您在此处Boys.Push($('#tex1').val())
所述的输入,那么您应该能够序列化这些输入并为您保存很麻烦= D.
即:模拟你的情况,它会像... ...
<% using (Html.BeginForm())
{ %>
<% var i1 = 5; %>
<% var i2 = 5; %>
<% for(var i=0; i < i1; i++)
{ %>
<% for (var ix = 0; ix < i2; ix++)
{%>
<input name="boys[<%=i %>]" value="VALUE_HERE"/>
<%} %>
<%} %>
<input type="submit" value="sumit" />
<%} %>
并且执行data: $('#formID').serialize()
会产生与创建project
js对象然后执行JSON.stringify(project)
相同的结果。