2011-08-09 43 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); 
    } 

但這代碼不起作用,我怎樣才能將數據綁定到列表框? 所以我想使用2個模型,每個列表框有一個...一個是普通學生,另一個是沒有訂閱課程的學生。 我怎麼能這樣做? 在我看來,我需要寫什麼代碼? 喜歡的東西:

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

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

列表框必須是具有多個colums一個列表框,以便它可以包含名稱,sirname,班級,學生的老師。

學生是一個對象,我想在該列表框中顯示student.Name,student.Sirname,student.Class等。

所以我可以使用ListBox中的對象,還是我必須將所有內容都轉換爲字符串?

我該怎麼做?

在此先感謝!

回答

0

基於Jason's answer,視圖中的第一行應包括:

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

這告訴你的看法,「模型」是類型StudentModel。如果在第一行(標題,語言,MasterPageFile等)中還有其他位,它們可以保持在那裏。


- 編輯:添加稍長的評論 -

需要記住的是,SelectListItem有三個必需的部分:值,文本和選擇。價值是關鍵,所以像StudentId或DocentId。文本顯示在列表中,所以類似於StudentName或DocentName。 Selected表示是否在列表中選擇此項目,通常爲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的方法嗎? ie .: public IEnumerable optionsList { get { // code } } – Lorenzo

+0

嗯,我以爲我在這裏添加了一條評論。無論如何,我用一個建議的方法更新了我的答案,將您的視圖使用的SelectListItem列表放在一起。 – Thorin

2

該模型不應該包含一個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> 
+0

它不工作:它給我以下錯誤: 錯誤'對象'不包含'NormalStudents'的定義並且沒有擴展方法'NormalStudents'接受類型'object'的第一個參數可以被找到(您是否缺少使用指令或程序集引用?) – Lorenzo

+0

您是否已在視圖中正確設置模型? – Jason

+0

現在我做了,謝謝,它有幫助! – Lorenzo