Bindig ListBox选择模型属性

时间:2017-05-09 15:14:11

标签: c# asp.net asp.net-mvc listbox

我一直在努力将MultiSelectList从Html助手绑定到特定模型。

模型
在我的模型中,我有类似的东西:

public class DefaultSelection
{
    public SelectionItem Selection1 {get;set;}
    public SelectionItem Selection2 {get;set;}
    public SelectionItem Selection3 {get;set;}

    public IEnumerable<SelectionItem> Items{get;set;}

    public DefaultSelection()
    {
        Selection1 = new SelectionItem(true, "Item1");
        Selection2 = new SelectionItem(false, "Item2");
        Selection3 = new SelectionItem(true, "Item3");
        Items = new List<SelectionItem>(new SelectionItem[]
                                        {Selection1,Selection2,Selection3});
    }
}

public class SelectionItem
{
    public bool Selected {get;set;}
    public string Name {get;set;}

    public SelectionItem(bool selected, string name)
    {
        Selected = selected;
        Name = name;
    }
}

我想要做的是将我的ListBox选项绑定到 SelectionItem Selected 属性。
我在我的观点中试过这个:

@Html.ListBoxFor(model => model.Items, new MultiSelectList( Model.Items, Model.Items.Where(item => item.Selected)), new { @class = "selectpicker" })

不幸的是,所选项目都没有正确显示(没有选择任何内容),也没有选择对模型产生任何影响......

有没有办法解决这个问题? 我可以摆脱这个 Items 属性,因为它只是对所需属性的引用吗?

2 个答案:

答案 0 :(得分:0)

我认为这比你想象的容易得多。我们试一试。

  

创建一个好的视图模型:

public class DefaultSelection
{
    public IEnumerable<SelectListItem> Items { get; set; }

    //Set a property to hold the selected items IDs.
    public IEnumerable<string> SelectedItems { get; set; }

    public DefaultSelection()
    {
        //preselected features
        Items = new List<SelectListItem>
        {
            new SelectListItem { Text = "Item1", Selected = true},
            new SelectListItem { Text = "Item2", Selected = false},
            new SelectListItem { Text = "Item3", Selected = true}
        };
    }
}
  

在视图中渲染ListBox:

<div class="form-group">
    @Html.LabelFor(x => x.Items)
    @Html.ListBoxFor(x => x.SelectedItems, Model.Items, new { @class = "selectpicker" })
</div>

请注意,我在这里使用的是内置的System.Web.Mvc.SelectListItem类,而不是您自定义的SelectionItem类 - 您可以安全地摆脱它。

现在,您将在发布后获得所选项目ID(在本例中为名称,因为您在创建项目时未指定value属性)。

希望这有帮助!

答案 1 :(得分:0)

您的@Html.ListBoxFor应该是这样的

@Html.ListBoxFor(model => model.SelectedNames, new MultiSelectList(Model.Items,"Name", "Name",Model.Items.Where(x=>x.Selected).Select(x=>x.Name)), new { @class = "selectpicker" })

您必须指定Value field Text fieldModel.Items "Name", "Name" Model.Items.Where(x=>x.Selected).Select(x=>x.Name)true将选择所选的所有值public List<string> SelectedNames { get; set; } 但是你的模型将返回字符串列表中的值,因此你应该定义一个字段

field_c

您将获得所选项目的值