Проблемы с заполнением и использованием MultiSelectList / ListBoxFor в ASP.NET MVC 3 - PullRequest
0 голосов
/ 18 марта 2012

Я пытаюсь адаптировать ответы для заполнения ListBoxFor, у которого есть заранее выбранные значения, которые я нашел здесь, на SO, и у меня возникли некоторые проблемы с адаптацией.

Это один из вопросов, которые я 'я имел в виду: здесь

Вот мой класс, который определяет объект списка

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

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

Мне кажется, что я так близко , но мне не хватает некоторого паттерна или, надеюсь, только правильного синтаксиса, чтобы заставить это работать таким образом, а не каквидел размещенный здесь.Я еще не дошел до View, но из того, что я видел, это так же просто, как заполнить обычный DropDownList.

1 Ответ

1 голос
/ 18 марта 2012

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

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

2-я часть вопроса - как получитьтекущие выбранные элементы, которые я считываю из БД в массив, который может использоваться 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...