Сложность привязки модели - PullRequest
1 голос
/ 10 июня 2010

У меня есть модель, и я использую ajax.post.Я вижу, что привязка модели не выполняется для массивов в моей модели, хотя привязка выполняется для свойств типа 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 Ответ

1 голос
/ 11 июня 2010

ModelBinding выполняется с использованием имени.Для любой коллекции, которую вы хотите связать, она должна иметь следующий формат:

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]

.,.

Но для того, чтобы заархивировать это, определение Boys в Javascript также должно быть коллекцией собраний, и я не уверен, как определить это в 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...