ASP.NET mvc: заполнить (связать данные) в списке - PullRequest
3 голосов
/ 09 августа 2011

Мне нужно заполнить два списка с данными из базы данных.Но мне нужно отобразить два списка в одном представлении, поэтому я создал класс ListBoxModel.

public class ListboxModel
{
    public ListBox LB1 { get; set; }
    public ListBox LB2 { get; set; }
}

И в моем контроллере:

public ActionResult IndexStudents(Docent docent, int lessonid, int classid)
    {
        var MyListBox = new ListboxModel
        {
            LB1 = new ListBox(docent.ReturnStudentsNormal(lessonid, classid),
            LB2 = new ListBox(docent.ReturnStudentsNoClass(lessonid, classid)
        };
        return View(MyListBox);
    }

Но этот код не работает, как можноПривязать данные к спискам?Поэтому я хотел бы использовать 2 модели, по одной для каждого списка: одну с обычными учениками и одну со студентами, которые не подписаны на уроки.Как я мог это сделать?И какой код я должен написать на мой взгляд?Что-то вроде:

<div class="editor-field">
     <%: Html.ListBox("IndexStudentsNormal", Model.LB1) %> 

<div class="editor-field">
      <%: Html.ListBox("IndexStudentsNoClass", Model.LB2) %> 

Список должен быть списком с несколькими столбцами, чтобы он мог содержать имя, имя, класс, учителяученика.

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

Можно ли использоватьобъект в ListBox, или мне нужно преобразовать все в строки?

Как я могу это сделать?

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 09 августа 2011

Модель не должна содержать ListBox, она должна просто содержать списки студентов. Хитрость заключается в том, чтобы максимально упростить модель, она должна состоять только из набора методов получения и установки свойств. Представление отвечает за привязку свойств модели к элементам HTML.

Модель:

public class StudentModel
{
  public IList<string> NormalStudents {get;set;}
  public IList<string> NoClassStudents {get;set;}
}

Контроллер:

public ActionResult IndexStudents(Docent docent, int lessonid, int classid)
{
    var studentModel = new ListboxModel
    {
       NormalStudents = docent.ReturnStudentsNormal(lessonid, classid),
       NoClassStudents = docent.ReturnStudentsNoClass(lessonid, classid)
    };

    return View(studentModel);
}

Вид:

<div class="editor-field">
    <%: Html.ListBox("IndexStudentsNormal", Model.NormalStudents) %>
  </div>

  <div class="editor-field">
    <%: Html.ListBox("IndexStudentsNoClass", Model.NoClassStudents) %>
  </div>
1 голос
/ 10 августа 2011

На основании ответа Джейсона первая строка в вашем представлении должна содержать:

<%@ Inherits="System.Web.Mvc.ViewPage<StudentModel>" %>

Это говорит о том, что «Модель» относится к типу StudentModel. Если в этой первой строке есть другие биты (Title, Language, MasterPageFile и т. Д.), То они могут остаться там.


- edit : добавить длинные комментарии -

Следует помнить, что SelectListItem состоит из трех обязательных частей: Value, Text и Selected. Значение является ключом, поэтому что-то вроде StudentId или DocentId. Текст отображается в списке, поэтому что-то вроде StudentName или DocentName. Выбранный указывает, выбран ли этот элемент в списке, обычно ложный.

Сейчас похоже, что у вас есть методы, которые возвращают только список имен учащихся (Docent.ReturnStudentsNormal () и Docent.ReturnStudentsNoClass ()). Я хотел бы, чтобы эти методы возвращали список пар ключ-значение, ключом является StudentId, а значением - StudentName.

Тогда вы можете изменить класс вашей модели на

public class StudentModel
{
  List<SelectListItem> NormalStudents;
  List<SelectListItem> StudentsNoClass;
}

и в вашем контроллере

public ActionResult IndexStudents(Docent docent, int lessonId, int classId)
{
  var studentModel = new StudentModel();

  var normalStudents = docent.ReturnStudentsNormal(lessonId, classId);
  foreach (var student in normalStudents)
  {
    studentModel.NormalStudents.Add(new SelectListItem() {Value = student.Key, Text = student.Value});
  }

  var studentsNoClass = docent.ReturnStudentsNormal(lessonId, classId);
  foreach (var student in studentsNoClass)
  {
    studentModel.StudentsNoClass.Add(new SelectListItem() {Value = student.Key, Text = student.Value});
  }

  return View(studentModel);
}

Теперь вы сможете использовать эти свойства в вашей модели напрямую для Html.ListBox().

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