2012-03-17 3 views
0

Я пытаюсь адаптировать ответы для заполнения ListBoxFor, который имеет предварительно выбранные значения, которые я нашел здесь в SO, и у меня есть некоторые проблемы с адаптацией.Устранение неполадок и использование MultiSelectList/ListBoxFor в ASP.NET MVC 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(??) 
    } 
} 

первая часть вопроса сверху здесь^Как заполнить 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

первая часть вопроса сверху здесь^Как заполнить MultiSlectList с моим Список SelectListDTO объектов

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

второй части вопроса, как получить выбранные элементы что I считывается из БД в массив, который может использоваться MultiSelectList в модели

Это не ясно, как ваш 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); 
} 

и если это массив некоторого сложного объекта, может выбрать соответствующее свойство, которое содержит идентификатор:

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! Я не получаю никаких проблем с компилятором, поэтому до завтра, когда я смогу проверить его на базе базы данных, я не буду знать окончательно, если это сработает, но оно идеально подходит для меня.Я знал, что это должно быть просто, но не сталкиваться с этой конкретной проблемой, прежде чем я не был уверен, как закончить ее. Спасибо за вашу помощь!! Кстати, это был второй вариант 2-й проблемы, которую вы предложили, которая соответствовала моим потребностям. LenderProduct.ProgramTypes действительно является списком типов программ, который является сложным типом, поэтому метод ToArray с идентификаторами работает отлично! –

Смежные вопросы