2015-07-16 3 views
0

У меня есть список, затем я хочу передать его для просмотра. Я использую метод привязки модели. Вот мой код: Модель:привязка модели между представлением и ошибкой контроллера

public class Group 
{ 
    public string Name { get; set; } 
    public string GroupID { get; set; } 
} 

Контроллер:

public ActionResult Index() 
{ 
    return View(ListGroup); 
} 

[HttpPost] 
public ActionResult Index(List<Group> listModel) 
{ 
    @ViewBag.Success = "Update Suceess"; 
    return View(listModel); 
} 

[HttpPost] 
public ActionResult Search(Group modelSearch) 
{ 
    List<Group> listResult = listGroup.Where(m=>m.GroupID == modelSearch.GroupID).ToList(); 

    if (modelSearch.GroupID == null) 
     return View("Index", listGroup); 

    return View("Index", listResult); 
} 

В связи я хочу, чтобы отобразить список группой из GroupID

@using (Html.BeginForm("Index", "DisplayTable", FormMethod.Post)) 
{ 
    <table> 
     <tr> 
      <td>Name</td> 
      <td>GroupID</td> 
     </tr> 
     @foreach(var items in Model.GroupBy(m => m.GroupID).Select(g => g.ToList())){ 
      <tr><td colspan="2">@items.ElementAt(0).GroupID</td></tr> 
      for (int i = 0; i < items.Count; i++) { 
      <tr> 
       <td>@Html.TextBoxFor(m => items[i].Name)</td> 
       <td>@Html.TextBoxFor(m => items[i].GroupID)</td> 
      </tr> 
      } 
     } 
    </table> 
     <input type="submit" value="SAVE" /> 
    } 

Моя проблема заключается в: Если я использую код выше, данные отображения отображаются в группе правильно, но когда я нажимаю кнопку SAVE, он не посылал никаких данных контроллеру, ActionResult Index(List<Group> listModel) получил нулевой список.

MORE ОБЪЯСНЕНИЕ: У меня есть список, как это:

  • ИМЯ | GROUPID Ручка; A Чернила; B Pecil; A Книга; C Линейка; B NoteBook; C

Я хочу, чтобы отобразить его в виду, как это:

  • GroupID: A - Pen: A | Карандаш: A
  • Группа: B - Линейка: B | Чернила: B
  • GroupID: C - Book: C | NoteBook: C

Если я использую этот код в представлении:

<td>@Html.TextBoxFor(m => items[i].Name)</td> 
<td>@Html.TextBoxFor(m => items[i].GroupID)</td> 

В результате с точки зрения является правильным, но это не может отправлять данные обратно в контроллер. Я обнаружил, что имя каждого поля NameGroupID не совпало с именем текстового поля в html.

Я использую группу в поле зрения, и я не знаю, что является лучшим способом в этом случае: Группируйте контроллер или в режиме просмотра. и Какова структура списка, если я группирую в контроллере.

+0

вы должны пользователем список < > вместо IEnumerable, for и EditFor вы раньше искали? http://stackoverflow.com/questions/12696988/mvc-editing-a-list-of-objects – Murilo

ответ

0

Попробуйте использовать Html.TextBox:

@{ var index = 0; } 
@foreach(var items in Model.GroupBy(m=>m.GroupID).Select(g=>g.ToList())){ 
    Html.TextBox("items[" + index + "].Name", items.Name); 
    Html.TextBox("items[" + index + "].GroupID", items.GroupID); 
    index++; 
} 
+0

Вам не нужно 'ToList()' здесь, не так ли? – abatishchev

+0

детали имеет более чем одну запись, так что я не могу писать items.Name или items.GroupID –

2

С вашего редактирования, я вижу, так что у вас есть список этих объектов, и вы должны сгруппировать их по идентификатору, так много объектов, как перо и карандаш имеет то же самое id 'A', если мы группируем их вместе, они принадлежат группе с ID 'A'.

Ваша лучшая практика заключается в том, чтобы иметь правильную бизнес-логику и модель от контроллера для просмотра. Как и в этом ответе, на самом деле у вас есть группа List'group в вашей модели, если вы хотите разделить бизнес и пользовательский интерфейс, затем создайте модель представления, которая содержит бизнес-объект вашей группы. Часть ui будет содержать список дочерних групп. Затем выполните сериализацию из модели viewmodel в бизнес-модель.

Для того, чтобы заполнить правильную модель только из списка дочерних элементов. См. Контроллер.

Во-первых, вы можете проверить источник страницы, чтобы узнать, создает ли бритва правильный html, который вы ожидаете.

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

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

<tr> 
 
\t \t \t \t <td colspan="2"> 
 
\t \t \t \t \t 0 - name - 0 
 
\t \t \t \t \t <input name="[0].GroupID" type="hidden" value="0" /> 
 
\t \t \t \t \t <input name="[0].Name" type="hidden" value="0 - name" /> 
 
\t \t \t \t </td> 
 
\t \t \t </tr> \t 
 
\t \t \t <tr> 
 
\t \t \t \t <td><input class="text-box single-line" name="[0].ListGroup[0].Name" type="text" value="0 - name0 - subname" /></td> 
 
\t \t \t \t <td><input name="[0].ListGroup[0].GroupID" type="text" value="00" /></td> 
 
\t \t \t </tr> 
 
\t \t \t <tr> 
 
\t \t \t \t <td><input class="text-box single-line" name="[0].ListGroup[1].Name" type="text" value="0 - name1 - subname" /></td> 
 
\t \t \t \t <td><input name="[0].ListGroup[1].GroupID" type="text" value="01" /></td> 
 
\t \t \t </tr>

Используйте код, приведенный ниже, чтобы сделать работу решения. Пожалуйста, не позволяйте людям редактировать идентификатор группы, как только это будет сохранено, это повлияет на поведение, идентификаторы должны оставаться уникальными. Это также верно в структуре вашего БД.

Ваш контроллер

public class homeController : Controller 
 
\t { 
 
\t \t // 
 
\t \t // GET: /home/ 
 

 
\t \t [HttpGet] 
 
\t \t public ActionResult Index() 
 
\t \t { 
 
\t \t \t List<Group> lst = new List<Group>(); 
 
\t \t \t for (var i = 0; i < 5; i++) 
 
\t \t \t { 
 
\t \t \t \t lst.Add(new Group() 
 
\t \t \t \t { 
 
\t \t \t \t \t GroupID = i.ToString(), 
 
\t \t \t \t \t Name = i.ToString() + " - name", 
 
\t \t \t \t \t ListGroup = new List<Group>() 
 
\t \t \t \t }); 
 
\t \t \t } 
 

 
\t \t \t foreach (var g in lst) 
 
\t \t \t { 
 
\t \t \t \t for (var i = 0; i < 3; i++) 
 
\t \t \t \t { 
 
\t \t \t \t \t g.ListGroup.Add(new Group() 
 
\t \t \t \t \t { 
 
\t \t \t \t \t \t GroupID = g.GroupID + i.ToString(), 
 
\t \t \t \t \t \t Name = g.Name + i.ToString() + " - subname", 
 
\t \t \t \t \t \t ListGroup = new List<Group>() 
 
\t \t \t \t \t }); 
 
\t \t \t \t } 
 
\t \t \t } 
 
\t \t \t 
 
\t \t \t return View(lst); 
 
\t \t } 
 

 
\t \t [HttpPost] 
 
\t \t public ActionResult Save(List<Group> listModel) 
 
\t \t { 
 
\t \t \t @ViewBag.Success = "Update Suceess"; 
 
\t \t \t return View(listModel); 
 
\t \t } 
 

 
\t \t public class Group 
 
\t \t { 
 
\t \t \t public string Name { get; set; } 
 
\t \t \t public string GroupID { get; set; } 
 
\t \t \t public List<Group> ListGroup { get; set; } 
 
\t \t } 
 
\t }

Ваш взгляд

@model List<TestMVC.Controllers.homeController.Group> 
 

 
@{ 
 
\t ViewBag.Title = "Index"; 
 
} 
 

 
<h2>Index</h2> 
 

 
@using (Html.BeginForm("Save", "Home", FormMethod.Post)) 
 
{ 
 
\t <table> 
 
\t \t <tr> 
 
\t \t \t <td>Name</td> 
 
\t \t \t <td>GroupID</td> 
 
\t \t </tr> 
 
\t \t @for (var g = 0; g < Model.Count; g++) 
 
    { 
 
\t \t \t <tr> 
 
\t \t \t \t <td colspan="2"> 
 
\t \t \t \t \t @Model[g].Name - @Model[g].GroupID 
 
\t \t \t \t \t @Html.HiddenFor(x => Model[g].GroupID) 
 
\t \t \t \t \t @Html.HiddenFor(x => Model[g].Name) 
 
\t \t \t \t </td> 
 
\t \t \t </tr> \t 
 
\t for (var i = 0; i < Model[g].ListGroup.Count; i++) 
 
\t { 
 
\t \t \t <tr> 
 
\t \t \t \t <td>@Html.EditorFor(x => Model[g].ListGroup[i].Name)</td> 
 
\t \t \t \t <td>@Html.TextBoxFor(x => Model[g].ListGroup[i].GroupID)</td> 
 
\t \t \t </tr> 
 
\t } 
 
    } 
 

 
\t </table> 
 
\t <input type="submit" value="SAVE" /> 
 
}

Runtime: enter image description here

Пожалуйста, обратите внимание на этот ответ здесь для другого подхода с использованием моделью редактор для: MVC Form not able to post List of objects

Дальнейшего чтения, отличный статье на Списке привязок в MVC: http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/

+0

@foreach (вар элемент в модели) { @ item.Name @ item.GroupID } Как можно группировать этот код –

+0

, но я хочу отображать его в группе и редактировать текст на каждом входе –

+0

, чтобы объяснить вашу конкретную потребность. – Denys

Смежные вопросы