无法在ASP.NET MVC 3中填充和使用MultiSelectList / ListBoxFor

时间:2012-03-17 20:30:56

标签: asp.net-mvc-3 c#-4.0

我正在尝试调整填充ListBoxFor的答案,该ListBoxFor具有我在SO上找到的预选值,并且在调整时遇到了一些问题。

这是我一直提到的问题之一: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部分来自上面^如何使用我的SelectListDTO对象列表填充MultiSlectList

同样在我的控制器操作中,我从DB获取保存的项目,并且需要将它们作为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使用的数组

我觉得我这个关闭但是我错过了一些模式或希望只是正确的语法让这个以这种方式工作,而不是我在这里发布的方式。 我还没有进入View,但是从我看到的内容就像填充普通的DropDownList一样简单。

1 个答案:

答案 0 :(得分:1)

  

问题的第一部分是从上面这里^如何填写   MultiSlectList与我的SelectListDTO对象列表

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

问题的第2部分是如何获取我当前选择的项目   从DB读取到可以使用的数组中   模型中的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);
}

如果它是某个复杂对象的数组,您可以选择包含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);
}