2010-06-10 3 views
1

У меня есть модель, и я использую 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

'ArrayList' не является общим. Какие типы объектов вы намерены хранить внутри? Общий «Список ' или 'Boy []' будет более уместным здесь, где вам нужно определить каждое свойство типа 'Boy'. –

+0

Можете ли вы объяснить, используя пример? Я заполняю массив в представлении и хочу иметь привязку модели arary. На самом деле я вижу, что значения, присланные из представлений, не привязаны к модели, а массивы все еще имеют уже созданные значения. Как я могу решить эту проблему? – learning

ответ

1

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(), 

EDIT: если мальчики не имеют свойства, то имя должно быть:

project.Boys[0] 
project.Boys[1] 
project.Boys[2] 

Вы пытались привязать второй параметр?

public ActionResult Create(ProjectModel project, string[] Boys) 

Я не использовал ArratList, потому что я сделал некоторые испытания, и это не кажется связать вообще, я предпочитаю использовать обычную декларацию массива.

Другой вещь, которую вы можете попробовать это осмотрят FormCollection

public ActionResult Create(FormCollection f) 

поставить точку останова только в начале и проверить значения, если имена внутри не следует project.Boys формата он никогда не будет связываться.

EDIT2: Если вы хотите привязать к нескольким массивам, то просто добавить определение коллекции модели:

public class ProjectModel 

    { 
     public IEnumerable<string[]> Boys { get; set; } 
    } 

и имена должны быть: для первого массива:

project.Boys[0] 
project.Boys[0] 

для второго:

project.Boys[1] 
project.Boys[1] 

. . .

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

+0

Boys - это только арраист, и я заполняю массив как Boys.Push ($ ('# tex1'). Val()), и он не имеет никакого свойства. – learning

+0

@user Omar говорит, что вы не можете использовать привязку ArrayList к модели. Если вам просто нужен список строк (это то, что мне кажется), тогда вы можете POST разделять запятыми строку и разделить ее на стороне сервера. – Ryan

+0

Спасибо Омару, у меня все еще есть трудности. На самом деле, мне нужно сделать привязку модели к массивам с помощью javascript, и сложная часть состоит в том, что у меня 5-6 массивов, и я не знаю, как это сделать. – learning