【问题标题】:ListBoxFor not letting me select multiple items MVCListBoxFor 不让我选择多个项目 MVC
【发布时间】:2016-06-16 01:02:03
【问题描述】:

当我运行代码时,我一次只能选择一个项目,这很奇怪,因为'ListBoxFor()'用于选择多个项目,所以我想要的是:

选择多个项目

查看(Index.cshtml):

<div>
    @Html.ListBoxFor(m => m.DropDownItems, new MultiSelectList(Repository.DDFetchItems(), "Value", "Text", Model.DropDownItems))
</div>

模型(ModelVariables.cs):

public class ModelVariables
{
    public List<SelectListItem> DropDownItems { get; set; } 
}

public static class Repository
{
    public static List<SelectListItem> DDFetchItems()
    {
        return new List<SelectListItem>()
        {
            new SelectListItem(){  Text = "Dogs", Value = "1", Selected = true},
            new SelectListItem(){  Text = "Cats", Value = "2"},
            new SelectListItem(){  Text = "Death", Value = "3"}
        };
    }
}

控制器(HomeController.cs):

[HttpGet]
public ActionResult Index()
{
    ModelVariables model = new ModelVariables()
    {
        DropDownItems = Repository.DDFetchItems()  
    };
    return View(model);
}

【问题讨论】:

    标签: c# html asp.net-mvc


    【解决方案1】:

    您不能将&lt;select multiple&gt; 绑定到复杂对象的集合(List&lt;SelectListItem&gt; 就是这样)。 &lt;select multiple&gt; 回发一组简单值(在您的情况下,如果您选择第一个和第三个选项,它将提交 [1, 3](所选选项的值)。

    您的模型需要绑定到 IEnumerable&lt;int&gt; 属性。

    public class ModelVariables
    {
        public IEnumerable<int> SelectedItems { get; set; }
        public IEnumerable<SelectListItem> DropDownItems { get; set; }
    }
    

    然后在GET方法中

    public ActionResult Index()
    {
        var ModelVariables= new ModelVariables()
        {
            DropDownItems = Repository.DDFetchItems(),
            SelectedItems = new List<int>(){ 1, 3 } // to preselect the 1st and 3rd options
        };
        return View(model);
    }
    

    在视图中

    @Html.ListBoxFor(m => m.SelectedItems, Model.DropDownItems)
    

    附注

    1. DDFetchItems() 方法中删除Selected = true - 它的 被ListBoxFor() 方法忽略,因为它的值 您的绑定属性决定了选择的内容
    2. 不需要从 ListBoxFor() 方法中的第一个(属性DropDownItems 已经是IEumerable&lt;SelectListItem&gt;)

    【讨论】:

    • 很好,我让它工作了,但是,我无法预先选择项目,因为我无法从 'int' 转换为 ,SelectedItems = new List() { 1 , 3 },它想要 而不是 'int',因为我更改了 public IEnumerable SelectedItems { get;放; }
    • 您无法将其更改为 IEnumerable&lt;SelectListItem&gt; SelectedItems - 正如我所解释的那样,这将永远无法正常工作(您无法&lt;select&gt; 绑定到复杂对象的集合,您的应用程序将失败如果你这样做了)。必须是IEnumerable&lt;int&gt; SelectedItems
    • 好吧,我恢复了它,现在我在 var selectedMDDItems = model.SelectedItems.Where(x => x.Selected).Select(x => x.Text) 中得到一个错误。列表(); 'int 不包含'Selected' 的定义,并且没有扩展方法'Selected' 接受'int' 类型的第一个参数
    • 没有。你不懂。 &lt;select multiple&gt; 将回传int 的数组 - 因此,如果您选择第二个和第三个选项,那么在 ost 方法中,model.SelectedItems 将是 [ 2, 3 ]。您不需要任何 Linq 来获取选定的值 - 您可以使用 foreach(int selected in model.SelectedItems) { .... }
    • 天哪。您需要重新填充 SelectList 是您返回视图。通读this question/answer了解
    猜你喜欢
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 2013-07-28
    • 2021-01-05
    相关资源
    最近更新 更多