2011-08-09 7 views
2

두 개의 목록 상자에 데이터베이스의 데이터를 채워야합니다. 하지만 하나의보기에 두 개의 목록 상자를 표시해야하므로 ListBoxModel 클래스를 만들었습니다. ASP.NET mvc : 목록 상자에 채우기 (데이터 바인딩)

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); 
    } 

그러나 작동하지 않습니다이 코드, 내가 어떻게리스트 박스에 데이터를 바인딩 할 수 있습니다? 그래서 두 개의 모델을 사용하고 싶습니다. 하나는 각 목록 상자, 하나는 일반 학생 및 하나는 수업에 가입하지 않은 학생입니다. 어떻게 할 수 있습니까? 내보기에 어떤 코드를 써야합니까? 같은 뭔가 :

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

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

목록 상자는 이름, sirname, 클래스, 학생의 교사를 포함 할 수 있도록 여러 colums와 목록 상자되어야합니다.

학생은 개체입니다. student.Name, student.Sirname, student.Class 등을 그 목록 상자에 표시하고 싶습니다.

그래서 ListBox에서 개체를 사용할 수 있습니까, 아니면 모든 것을 문자열로 변환해야합니까?

어떻게하면됩니까?

미리 감사드립니다.

답변

0

Jason's answer을 바탕으로,보기의 첫 번째 행이 포함되어야

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

"Model"이 StudentModel 유형임을 사용자에게 알려줍니다. 이 첫 번째 줄에 다른 비트 (제목, 언어, MasterPageFile 등)가 있으면 거기에 있어도 좋습니다.


-편집 : 추가 기름 한 의견 -

기억해야 할 것은있는 SelectListItem 세 가지 필요한 부분이 있는지 : 값, 텍스트 선택하고 선택을. 값이 핵심이므로 StudentId 또는 DocentId와 같습니다. 텍스트가 목록에 표시되므로 StudentName 또는 DocentName과 유사합니다. 선택됨은이 항목이 목록에서 선택되었는지 여부를 나타냅니다. 일반적으로 false입니다.

지금은 학생 이름 (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() 직접 모델에 이러한 속성을 사용 할 수 있습니다에있는 것으로 변경할 수 있습니다.

+0

오케, 내 관점에서 첫 번째 줄을 변경했습니다. 이제는 내 방법을 인식합니다! 감사! 그러나 또 다른 문제가 나타납니다 : "Html.Listbox"에 잘못된 인수가 있습니다 ... IEnumerable 에 IEnumerable 을 어떻게 캐스트 할 수 있습니까? ------------------------------------------------- 오류 인수 3 : 'System.Collections.Generic.IEnumerable '을 'System.Collections.Generic.IEnumerable '으로 변환 할 수 없습니다. – Lorenzo

+0

SelectListItems를 반환하는 메서드를 정의해야합니까? 예 : 공개 IEnumerable optionsList { get { // 코드 } } – Lorenzo

+0

흠, 여기에 의견을 추가 한 것 같습니다. 어쨌든, 나는 당신의 견해에 의해 사용될 SelectListItem의리스트를 정리하는 제안 된 방법으로 나의 대답을 업데이트했다. – Thorin

2

모델에 ListBox가 없어야하며, 학생 목록 만 포함해야합니다. 트릭은 모델을 가능한 한 간단하게 유지하는 것입니다. 실제로는이 모델을 속성 getter 및 setter로만 묶어야합니다. 뷰는 모델의 속성을 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> 
+0

오류가 발생합니다 : 오류 '개체'에 'NormalStudents'에 대한 정의가없고 확장 메서드가없는 'NormalStudents'유형 'object'의 첫 번째 인수를 찾을 수 있음 (using 지시문이나 어셈블리 참조가 누락 되었습니까?) – Lorenzo

+0

보기에서 모델을 올바르게 설정 했습니까? – Jason

+0

이제 감사했습니다. 도움이되었습니다. – Lorenzo