2015-03-07 2 views
0

Я новичок в MVC, и я пытаюсь выяснить, как связать динамический список.Список динамической модели не привязан к сообщению

Я выполнил инструкции из этого example и других примеров, чтобы создать таблицу. Новые элементы успешно добавлены в таблицу. Тем не менее, при отправке назад только элемент по умолчанию, который был добавлен в список изначально, доступен, ни один из новых.

Это мои модели:

public class ItemModel { 
    public int ID { get; set; } 

    [Display(Name = "Name")] 
    public string Name { get; set; } 

    [Display(Name = "Description")] 
    public string Description { get; set; } 

} 

public class MainModel{ 
    public List<ItemModel> Items { get; set; } 

    public MainModel(){ 
     Items = new List<ItemModel>() 
    } 
} 

Мое мнение:

<table id="list"> 
      <thead> 
       <tr> 
        <th style="width: 150px;"> 
         @Html.DisplayNameFor(model => model.Items[0].Name) 
        </th> 
        <th> 
         @Html.DisplayNameFor(model => model.Items[0].Description) 
        </th> 
        <th> 
         Delete 
        </th> 
       </tr> 
      </thead> 
      <tbody> 
       @Html.Partial("Item", Model) 
      </tbody> 
     </table> 

Частичный вид:

@for (var i = 0; i < Model.Items.Count; i++) { 
<tr> 
    <td> 
     @Html.TextBoxFor(model => model.Items[i].Name) 
    </td> 
    <td> 
     @Html.TextBoxFor(model => model.Items[i].Description) 
    </td> 
    <td> 
     <button class="btn" type="button" data-id="@Model.Items[i].ID" value="Delete"/> 
    </td> 
</tr> 
} 

Я использую Ajax сообщение для добавления новых элементов в таблице:

$('.add').click(function() { 
     var action = "/Project/Add"; 
     $.ajax({ 
      url: action, 
      cache: false, 
      success: function (result) { 
       $("#list").find("tbody").empty().append($(result)); 
      } 
     }); 
    }); 
Действие

Контроллер:

public ActionResult Add() { 
     ItemModel item = new ItemModel(); 
     try { 
      item.ID =  ((MainModel)Session["MainModel"]).Items.LastOrDefault().ID + 1; 
      ((MainModel)Session["MainModel"]).Items.Add(item); 
     } catch (Exception) { 
      return Json(null); 
     } 
     return PartialView("Item", Session["MainModel"]); 
    } 

Может кто-то пожалуйста, скажите мне, что я делаю неправильно?

Спасибо.

+0

Каков ваш метод проводка? И поскольку ваш метод 'Add()' возвращает всю таблицу снова, вы не получаете большую пользу от использования ajax. [Этот ответ] (http://stackoverflow.com/questions/28019793/submit-same-partial-view-called-multiple-times-data-to-controller/28081308#28081308) показывает некоторые варианты, которые следует учитывать для повышения производительности (и избавиться от ненужного использования 'Session') –

+0

Где находится метод действия контроллера, который выполняется при обратной передаче? –

+0

Я не вижу, что вы используете привязку в методе действий Add() !, и я не вижу, что вы отправляете данные в свой вызов ajax! Не уверен, что я что-то упустил, но я не понимаю, как будет работать ваш код. Я предлагаю вам проверить другие примеры в сети. –

ответ

0

Возможно, вы создаете новый пустой элемент каждый раз, когда вызывается public ActionResult Add(). Затем установите свой идентификатор, а затем добавьте его в модель в сеансе. Свойства имени и описания не задаются.

Чтобы добавить элемент, добавленный на страницу, вы должны отправить данные в параметр в методе Add(), иначе в ваш элемент не будет данных.

Кроме того, заключительная часть для прохождения назад данные:

return PartialView("Item", Session["MainModel"]); 

Было бы лучше, чтобы бросить это как MainModel:

(MainModel)Session["MainModel"] 
Смежные вопросы