c# - 如何让我的 MultiSelectList 绑定(bind)到我的数据模型?

标签 c# asp.net-mvc entity-framework asp.net-mvc-5 entity-framework-6

我在汽车和许多其他表格之间建立了多对多关系。在我看来,我希望能够为诸如灯光之类的项目提供多选列表。我尝试了很多不同的格式,我似乎无法获得设置所选项目的列表。我首选的方式是 @Html.ListBoxFor(model => model.enitity.relatedentity, Model.SomeSelectListItemList) ,但我似乎无法获取列表以在 View 中设置所选项目。

下面是我用来测试的代码 我使用 Asp.net MVC5、C# 和 Entity Framework 6。

这是我的 Controller 操作

    // GET: Car/Edit/
    [Authorize(Roles = "Ecar")]
    public ActionResult Edit(int id)
    {


        CarsEditViewModel carEditViewModel = new CarsEditViewModel();

        carEditViewModel.Cars = unitOfWorkcar.CarRepository.FindIncluding(id);

        IList<Approval> approvalList = unitOfWorkcar.ApprovalRepository.All.ToList();
        IList<Connector> connectorList = unitOfWorkcar.ConnectorRepository.All.ToList();
        IList<InputVoltage> inputVoltagesList = unitOfWorkcar.InputVoltageRepository.All.ToList();



        carEditViewModel.ApprovalList = from c in approvalList select new SelectListItem { Text = c.Name, Value = c.Id.ToString(), Selected = true};

        carEditViewModel.Categories = new MultiSelectList(carEditViewModel.ApprovalList, "Value", "Text", "Selected");


       // ,carEditViewModel.ApprovalList.Select(c => c.Text),carEditViewModel.ApprovalList.Select(c => c.Selected)

        //carEditViewModel.ApprovalList = from c in approvalList select new MultiSelectList( //{ Selected = (carEditViewModel.Cars.Approvals.Any(app => app.Id == c.Id)) , Text = c.Name, Value = c.Id.ToString() };
       // carEditViewModel.ConnectorList = from c in connectorList select new SelectListItem { Selected = true,  Text = c.Name, Value = c.Id.ToString() };
        carEditViewModel.InputVoltageList = from c in inputVoltagesList select new SelectListItem { Text = c.Name, Value = c.Id.ToString() };



        return View(carEditViewModel);

    }

这是我的看法

@model NewBobPortal.ViewModels.CarsEditViewModel

 @using (Html.BeginForm())
{



   @* @Html.ListBoxFor("SelectedApprovals",model => model., new { @class = "multiselect" })*@
    @*@Html.ListBoxFor(model => model.Cars.Approvals, Model.ApprovalList)
    @Html.ListBoxFor(model => model.Cars.Connectors,Model.ConnectorList, new {Multiple = "multiple"})
    @Html.ListBoxFor(model => model.ConnectorList, Model.ConnectorList)*@
    @*@Html.ListBox("test",Model.Cars.InputVoltages, Model.InputVoltageList)*@
    @Html.DropDownList("somethingelse", new MultiSelectList(Model.InputVoltageList, "Value", "Text", Model.InputVoltageList.Select(c => c.Value)), new { multiple = "multiple" })
    @Html.DropDownListFor(model => model.Cars.InputVoltages , new MultiSelectList(Model.LensColorList, "Value", "Text", Model.LensColorList.Select(c => c.Value)), new { multiple = "multiple" })


    @Html.ListBoxFor(m => m.Cars.Approvals, Model.Categories)



    <p>
        <input type="submit" value="Save" />
    </p>

这是我的 View 模型

using NewBobPortal.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

 namespace NewBobPortal.ViewModels
 {
public class CarsEditViewModel
{
    public Car Cars { get; set; }
    public IEnumerable<SelectListItem> ApprovalList { get; set; }
    public IEnumerable<MultiSelectList> ConnectorList { get; set; }
    public IEnumerable<SelectListItem> InputVoltageList { get; set; }




    public MultiSelectList Categories { get; set; }
    public IEnumerable<Approval> SelectedCategories { get; set; }

}

最佳答案

为多对多关系发布值的最大问题是没有可绑定(bind)到模型上的直接字段。这是 View 模型变得非常方便的地方,您已经在使用它,但使用的方式并不完全正确。

首先你需要你的 SelectList ,它实际上可以只是一个 IEnumerable<SelectListItem> .这将包含所有 可用选项,这很简单。所以在你的 View 模型中:

public IEnumerable<SelectListItem> CategoryChoices { get; set; }

在你的行动中:

carEditViewModel.CategoryChoices = approvalList.Select(m => new SelectListItem {
    Text = c.Name,
    Value = c.Id.ToString()
});

请注意,我没有设置 Selected : 我们会让 HtmlHelper 处理它。我也没有处理 MultiSelectList还是。

现在,您还需要回发一些内容,因为您的值是 id,我们将使用 List<int> ,所以在你的 View 模型中:

private List<int> selectedCategories;
public List<int> SelectedCategories
{
    get
    {
        if (selectCategories == null)
        {
            selectedCategories = Categories.Select(m => m.Id).ToList();
        }
        return selectedCategories;
    }
    set { selectedCategories = value; }
}

这里发生了一些事情。 set该属性的方法很简单:当我们返回一个发布值时,只需设置 selectedCategories到那个。 get有点复杂:这里我们需要将您的类别对象列表(在这里称为 Categories 因为我不知道这实际上是从哪里来的)压缩为这些类别的简单 ID 列表。

现在,在你看来:

@Html.ListBoxFor(m => m.SelectedCategories, Model.CategoryChoices)

这就是您所需要的。您正在使用 ListBox控制所以它已经是一个多选列表。并且,通过将它绑定(bind)到所有当前选择的 id 列表,它知道在 SelectListItem 列表中自动选择哪些项目。它来自 Model.CategoryChoices .

在您的 post 操作中,您需要将这些 id 转换为它们的关联对象:

 var newCategories = repository.Categories.Where(m => carEditViewModel.SelectedCategories.Contains(m.Id));

然后,您可以手动将模型的类别设置到这个新列表中:

car.Categories = newCategories;

关于c# - 如何让我的 MultiSelectList 绑定(bind)到我的数据模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19663782/

相关文章:

c# - 使用 cal :Message. 附加在 WPF 上下文菜单中的 "No target method found"错误

c# - ASP.NET MVC5 从布局访问 ViewBag?

c# - 命名空间 "MvxWindowsPage"中不存在名称 "using:Cirrious.MvvmCross.WindowsUWP.Views"

c# - 如何计算 UWP BackgroundDownloader 中的下载速度?

asp.net-mvc - 在mvc中根据其输入类型的属性(id)重命名上传的文件asp.net

c# - 使用 DI/抽象工厂模式时的依赖关系处理

c# - LINQ to EF4 日期时间比较问题

entity-framework - EF:延迟加载,渴望加载和“枚举可枚举”

c# - 覆盖 SaveChanges 并删除 EF 关系时为 null

javascript - 如何对 javascript 事件执行 Html.Action?