2012-03-17 34 views
0

我試圖修改填充ListBoxFor的答案,該列表框已經預先選定了我在這裏找到的值,並且在適應方面遇到了一些麻煩。在ASP.NET MVC中填充和使用MultiSelectList/ListBoxFor問題3

這是我一直提到的一個問題:here

這裏是我的類來定義列表對象

public class SelectListDTO { 

    public int ID { get; set; } 
    public string Name { get; set; } 
} 

我有一個填充的列表上一個類的方法SelectListDTO項目。 CheckRefresh檢查緩存是否過期,如果是,則重新緩存。因此,這種方法得到我的列表:

private List<SelectListDTO> GetSelectList() { 
     CheckRefresh(); 
     var lst = new List<SelectListDTO>(_cache.Count + 1); 
     _cache.ForEach(item => lst.Add(new SelectListDTO { ID = item.ID, Name = item.Name }));    
     return lst; 
    } 

我的模型與這些屬性/方法定義:

public class MyModel { 

    [Required] 
    [Display(Name = "Program Type")] 
    [Min(1, ErrorMessage = "Please select a Program Type")] 
    public int[] SelectedProgramTypes { get; set; } 

    public MultiSelectList ProgramTypes { get; set; } 

    public MyModel() { 
     PopulateProgramTypeList(); 
    } 

    private void PopulateProgramTypeList() { 
     // Get all available list items 
     var programTypes = ProgramTypeService.Instance.GetSelectList; 
     // how to fill multiselectlist with my List<SelectListDTO> items; 
     ProgramTypes = new MultiSelectList(??) 
    } 
} 

問題的第1部分是從上面這裏^如何用我的名單填補MultiSlectList SelectListDTO對象

另外在我的控制器操作中,我從數據庫中獲取保存的項目,並需要將它們作爲SelectedProgramTypes傳遞給模型。這是目前我的行動:

public ActionResult Edit(int? id) { 
     // Code here to validate id and that user is associated with id 
     lenderProduct = new LenderProduct(id); 
     var model = BuildModel(lenderProduct); // returns instance or MyModel 
     var selectedProgramTypes = lenderProduct.ProgramTypes; 
     foreach (var item in selectedProgramTypes) { 
      /// How to fill the Model.SelectedProgramTypes array 
     } 
     return View(model); 
    } 

問題的第二部分是如何讓我從數據庫中讀取到可以由MultiSelectList示範

使用的陣列當前選定的項目

我覺得我是這個關閉但我錯過了一些模式或希望只是正確的語法來獲得這種工作在這種方式,而不是我見過的方式發佈在這裏。 我還沒有做到視圖,但從我看到的,就像填寫一個正常的DropDownList一樣簡單。

回答

1

問題的第1部分是從上面這裏^如何與我SelectListDTO的名單填補 MultiSlectList對象

ProgramTypes = new MultiSelectList(programTypes.Select(x => new SelectListItem 
{ 
    Value = x.ID.ToString(), 
    Text = x.Name 
})); 
問題

第二部分是如何獲取當前選定的項目我 從數據庫讀取到數組中,可以使用 多選列表中的模型

LenderProduct類的樣子,但假設ProgramTypes屬性只是一個整數數組,你可以直接將其分配給您的視圖模型目前尚不清楚:

public ActionResult Edit(int? id) 
{ 
    // Code here to validate id and that user is associated with id 
    var lenderProduct = new LenderProduct(id); 
    var model = BuildModel(lenderProduct); // returns instance or MyModel 
    model.SelectedProgramTypes = lenderProduct.ProgramTypes; 
    return View(model); 
} 

,如果是一些複雜對象的數組你可以選擇包含該id的相應屬性:

public ActionResult Edit(int? id) 
{ 
    // Code here to validate id and that user is associated with id 
    var lenderProduct = new LenderProduct(id); 
    var model = BuildModel(lenderProduct); // returns instance or MyModel 
    model.SelectedProgramTypes = lenderProduct.ProgramTypes.Select(x => x.ID).ToArray(); 
    return View(model); 
} 
+0

Thanks Darin!我沒有得到任何編譯器問題,所以直到明天,當我可以對數據庫進行測試時,我不會明確地知道它是否有效,但它對我來說看起來很完美。我知道這很簡單,但在我不確定如何完成之前沒有遇到過這個具體問題。謝謝你的幫助!!順便說一下,這是您提供的第二個問題的第二個選項,可以滿足我的需求。 LenderProduct.ProgramTypes確實是一個複雜類型的程序類型列表,因此具有IDs方法的ToArray完美無缺! – 2012-03-18 13:45:48