将多选选项绑定到对象列表

时间:2015-06-12 18:55:36

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

我有一个像这样的视图模型:

public class ListingPlanEditorViewModel
{
    public ListingPlan Plan { get; set; }
    public IEnumerable<Directory> SiteDirectories { get; set; }
}

一个属性是这里的类型为ListingPlan的对象:

public class ListingPlan
{
    public int? ListingPlanID { get; set; }
    public int DescriptionLinesCount { get; set; }
    public List<Directory> Directories { get; set; }
}

对象目录如下所示:

public class Directory
{
    public int DirectoryID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
}

我有一个控制器,它将一个ListingPlanEditorViewModel返回给视图:

   public ActionResult ConfigurePlan(int? listingIdentifier)
    {
        ListingPlan plan = new ListingPlan()
        {
            DescriptionLinesCount = 10,
            Directories = new List<Directory>()
            {
                new Directory()
                {
                    DirectoryID = 3
                },
                new Directory()
                {
                    DirectoryID = 4
                }
            }
        };
        ListingPlanEditorViewModel model = new ListingPlanEditorViewModel()
        {
            Plan = plan,//_listingRepository.GetListingPlan(listingIdentifier, null),
            SiteDirectories = _database.GetDirectories()
        };

        return View(model);
    }

我想创建一个多选框,它将选定的值绑定到ListingPlanEditorViewModel中的Plan属性,为每个选择设置DirectoryID属性。所以在绑定后我应该有一个Directory对象列表。全部都有他们的DirectoryID设置。

我在做这件事时遇到了一些麻烦。我可以使用正确的选择选项创建多选框,但我无法在我的帖子操作中检索它们,如下所示:

@using (Html.BeginForm("ConfigurePlan", "ListingPlan"))
{
    <div class="form-body">
        @Html.ListBoxFor(model => model.Plan.Directories, new MultiSelectList(Model.SiteDirectories, "DirectoryID", "Name"))
</div>

<button type="submit">submit</button>
}

1 个答案:

答案 0 :(得分:2)

您必须在ViewModel中创建[]List IDs来存储选定的值。

public class ListingPlanEditorViewModel
{
    public ListingPlan Plan { get; set; }
    public IEnumerable<Directory> SiteDirectories { get; set; }
    public int[] DirectoryIDs {get;set;}
}

视图将改变。所选目录将存储在DirectoryIDs

@using (Html.BeginForm("ConfigurePlan", "ListingPlan"))
{
    <div class="form-body">
        @Html.ListBoxFor(model => model.DirectoryIDs, new MultiSelectList(Model.SiteDirectories, "DirectoryID", "Name"))
    </div>

    <button type="submit">submit</button>
}

现在在POST操作上,您可以查询数据库并获取用户选择的Directories

注意:您无法获得完整对象,因为ListBoxFor会生成一个<select multiple ... > ... </select>标记赢得&#39;知道如何绑定到你的对象。

相关问题