2013-03-14 4 views
0

У меня есть базовый формат Create/Edit/Delete/Index, созданный MVC с моим классом (ClassA). Класс содержит список объектов (ClassB).MVC Изменить список внутри объекта

Когда я вызываю представление для редактирования объекта, я могу редактировать все члены ClassA (текстовые поля и т. Д.), Но как я могу отредактировать список объектов, а затем вернуть их обратно к сообщению?

Когда я пытаюсь создать и перебрать объекты и добавить их в форму, он не возвращается с объектом (ClassA), а список объектов пуст.

Пожалуйста, помогите. Какова наилучшая практика для этого?

Ниже приведен пример класса

public ActionResult Edit(int id) 
    { 
     ClassA objA = db.ClassAs.Single(a => a.id == id); 

     objA.myListOfBs.Add(new ClassB()); 

     return View(objA); 
    } 

    [HttpPost] 
    public ActionResult Create(ObjectA obj) 
    { 
     obj.myListOfBs <--- this is empty! :(
     if (ModelState.IsValid) 
     { 
     } 

     return View(obj); 
     } 

модели:

class ClassA { 
     int id; 
    List<ClassB> myListOfBs; 
} 

class ClassB { 
    int id; 
    string name; 
} 

Вот мой Посмотреть

@model MyProject.Models.ClassA 

@{ 
    ViewBag.Title = "ClassA Object"; 
} 
@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 

    <fieldset> 
     <legend>Objects</legend> 

     @Html.EditorFor(model => model.myListOfBs) 

     <p> 
      <input type="submit" value="Save" /> 
     </p> 
    </fieldset> 
} 
+0

Не могли бы вы высказать свои классы моделей? – Oliver

+0

http://stackoverflow.com/questions/15049463/mvc4-adding-deleting-from-nested-collections-with-jquery/15049977#15049977 –

+0

Ваша проблема почти наверняка на ваш взгляд. Не могли бы вы разместить его, пожалуйста? Я предполагаю, что вы используете цикл foreach, чтобы перебирать список, и не соблюдайте требования к именам для вложений в mvc-модели. –

ответ

1

Found почему это происходит. Это была ошибка, но я не понял, что это вызвало бы ее.

Объект внутри моего основного объекта был объявлен

class ClassA { 
public ClassB country; 
} 

вместо

class ClassA { 
public ClassB country {get; set;} 
} 

Так что, кажется, что это должно быть свойство правильно связывать объекты.

ГЛАВНЫЕ Устранено ЗДЕСЬ

Я хотел бы также добавить, что, хотя добавление набора/получить теги позволяют прохождение объекта через к столбу, он все равно не работать со списком внутри объекта ,

я наконец узнал, как сделать это здесь (ASP.NET MVC 3 Binding to a Collection inside an Object), где в основном вам нужно сопоставить конкретный элемент в модели

Пример:

@for (int i = 0; i < Model.myListOfBs.Count; i++) 
{ 
    <div> 
     @Html.LabelFor(m => Model.myListOfBs[i].name) 
    </div> 
    <div> 
     @Html.TextBoxFor(m => Model.myListOfBs[i].name) 
    </div> 
} 

Mapping явно расположение массива сделало Хитрость. Поскольку вы не можете явно сопоставлять элемент списка с помощью foreach, он терпит неудачу.

Также, если вы похожи на меня и используете Entity Framework, вам, скорее всего, придется использовать ViewModels для доступа к элементам массива.

0

Я видел это раньше. Самый простой способ сделать это (с этим примером структуры) является:

ViewModel:

public string CompanyName { get; set; } 
public List<ViewModelOfObjects> SubObjects { get; set; } 

Как вы можете видеть, ваши суб-объекты должны иметь свои собственные ViewModel, то вы можете сделать это в View ,

@model YourMainViewModel 

@Html.EditorFor(model => model.CompanyName) 

// MVC is clever enough to work this out and list all the sub-Views, even if they are hidden fields and not editable. 
@Html.EditorFor(model => model.SubObjects) 
+0

Я не совсем понимаю это, SubObjects заменяются другим типом? Мне нужно создать другую модель и скопировать данные из объекта ClassB в объект ViewModelOfClassB? –

+0

SubObjects - это ViewModel в их собственном праве. Скажем, если это является объектом Customer, это будет новый CustomerViewModel с теми же свойствами (но как ViewModel) в качестве объекта Customer. Тогда MVC сможет связать эти под-объекты с вашим основным объектом. –

+0

Я боюсь, что это все еще не работает. Он по-прежнему отменяет список, когда он запускает событие post. Хотя я пытался создать список строк и просматривать его в представлении с помощью @ Html.EditFor, и это сработало! грубо правильно, и список не был нулевым для обратной передачи. Я думал, что ViewModel была такой же, как Model, но где структура изменилась, и вы не хотите изменять базовую модель? –

0

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

Например, в вашем случае, вы могли бы иметь следующее на ваш взгляд:

@model ClassA 
int index = 0; 
@foreach (var classB in Model.myListOfBs) 
{ 
    //Notice the use of "obj", this matches the name of your model parameter in your post action 
    @Html.Hidden("obj.myListOfBs.Index", index) 
    @Html.TextBox("obj.myListOfBs[" + index + "].name", classB.name) 
    index++; 
} 

При регистрации этой формы на ваши действия, модель связующий будет использовать индексацию именования подробно выше, чтобы связать каждое из полей к коллекции myListOfBs в вашей модели.

Альтернативно, как @thedixon отметил, рамки MVC можно создавать имена полей автоматически (Я не уверен, что это возможно во всех версиях ASP.NET MVC):

@Html.EditorFor(model => model.myListOfBs) 
Смежные вопросы