2015-11-13 38 views
1

使用第一種方法我在列表框中設置默認主題,然後使用第二種方法我只檢索這些被選中的人。檢索列表框中的所有項目,並只選擇那些在db

public void SubjectsList() 
    { 
     ViewBag.Subjects = 
      new SelectList(new[] { "Math", "Physic", "English" } 
      .Select(x => new { value = x, text = x }), 
      "Value", "Text"); 

    } 

    public void SubjectsFromDb(int id) 
    { 
     var students = _db.Subjects.AsEnumerable().Where(x => x.StudentId == id).Select(q => new SelectListItem 
     { 
      Value = q.Name, 
      Text = q.Name, 
     }).ToList(); 
     ViewBag.Subjects = students; 
    } 

我該怎麼做在Listbox中是所有主題,但選擇只有這些是在DB?

這裏是我的列表框

<div class="form-group"> 
      @Html.LabelFor(model => model.Subject, new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.ListBoxFor(model => model.Subject, 
     new MultiSelectList((IEnumerable<SelectListItem>)ViewBag.Subjects, "Value", "Text"), 
        new { style = "display:block;" }) 
       @Html.ValidationMessageFor(model => model.Subject) 
      </div> 
     </div> 
+0

它只是需要'ViewBag.Subjects = new SelectList(new [] {「Math」,「Physic」,「English」});'不需要額外的開銷創建匿名對象:) –

+0

@StephenMuecke ok會改善這一點。你能幫我解決問題嗎? –

+0

當然,你能確認屬性'Subject'是'IEnumerable '? –

回答

0

Subject必須public IEnumerable<string> Subject { get; set; }雖然我會建議它改名爲Subjects你的模型屬性 - 複數),你在GET方法命名ViewBag財產

的,分配現有的受試者到模型

var model = yourModel() 
{ 
    Subjects = _db.Subjects.Where(x => x.StudentId == id).Select(q => q.Name); 
}; 
ViewBag.SubjectList = new SelectList(new[] { "Math", "Physic", "English" }); 
return View(model); 

然後在視圖其

@Html.ListBoxFor(m => m.Subjects, (SelectList)ViewBag.SubjectList) 

旁註:

  1. 沒有必要創建匿名 對象產生的額外開銷SelectList - 你可以刪除.Select(x => new { value = x, text = x }), "Value", "Text")
  2. 由於其已經是一個SelectList,有無需額外的 開銷創建另一個重複SelectListListBoxFor()方法
+0

但它工作的字符串數組也 – unique

+0

@unique - 你有什麼想說的? 'string []'是'IEnumerable ' –

+0

另一方面說明:您的代碼表明您的數據庫結構可能是錯誤的。你應該有一個帶有ID int和Name varchar的'Subjects'和一個帶'ID int','Student int'(FK給Students表)和'Subject int'(FK到Subjects表)的表'StudentSubjects' ) –

相關問題