0

I'm trying to adapt the answers for filling a ListBoxFor that has preselected values that I've found here on SO and am having some trouble with the adaptation.

This is one of the questions I've been referring to: here

Here is my class that defines a list object

public class SelectListDTO {

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

I have a method on a class that fills a List of SelectListDTO items. The CheckRefresh checks to see if the cache is expired, if so it refills the cache. So this method gets my list:

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

My Model is define with these Properties/Methods:

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(??)
    }
}

1st part of question is from above here^ How to fill the MultiSlectList with my List of SelectListDTO objects

Also in my controller action I am getting the saved items from the DB and will need to pass them to the model as SelectedProgramTypes. This is currently in my action:

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

2nd part of question is how to get the currently selected items that I read from the DB into the array that can be used by the MultiSelectList in the Model

I feel like I'm this close but am missing some pattern or hopefully just the correct syntax into getting this to work in this way as opposed to the ways I've seen posted here. I haven't made it to the View yet but from what I've seen that is just as easy as filling a normal DropDownList.

Community
  • 1
  • 1
CD Smith
  • 6,597
  • 7
  • 40
  • 66

1 Answers1

1

1st part of question is from above here^ How to fill the MultiSlectList with my List of SelectListDTO objects

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

2nd part of question is how to get the currently selected items that I read from the DB into the array that can be used by the MultiSelectList in the Model

It's not clear how your LenderProduct class looks like but assuming the ProgramTypes property is just an array of integers you could directly assign it to your 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;
    return View(model);
}

and if it is an array of some complex object you could select the corresponding property that contains the 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);
}
Darin Dimitrov
  • 1,023,142
  • 271
  • 3,287
  • 2,928
  • Thanks Darin! I don't get any compiler issues so until tomorrow when I can test it against the database I won't know definitively if it works but it looks perfect to me. I knew it had to be simple but having not come across this specific problem before I wasn't sure how to finish it out. Thanks for your help!! By the way, it was the 2nd option on the 2nd problem that you offered that met my needs. LenderProduct.ProgramTypes is indeed a List of ProgramTypes which is a complex type so the ToArray with the IDs method works perfect! – CD Smith Mar 18 '12 at 13:45