模型绑定难度

时间:2010-06-10 07:35:02

标签: asp.net-mvc model-view-controller

我有一个模型,我正在使用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");
        }

...

1 个答案:

答案 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)相同的结果。