【问题标题】:Selecting from multiple lists in model and putting it in a dropdown从模型中的多个列表中选择并将其放入下拉列表中
【发布时间】:2020-08-10 17:36:36
【问题描述】:

我正在尝试通过这样做来填充我的下拉列表

  var componentList = (from c in model.Components
                                 select new
                                 {
                                     compID = c.ID,
                                     compName = c.CompID + ":" + c.ComponentName
                                 }).OrderBy(x => x.compName).ToList();
                      (from sc in model.ComponentSubComps
                                select new
                                {
                                     compID = sc.ID,
                                     compName = sc.SubCompID + ":" + sc.SubCompName
                                }).OrderBy(x => x.compName).ToList();

  ViewBag.Components = new SelectList(componentList, "compID", "compName");

但它只是从模型中的model.Components 列表中提取数据。我怎样才能让它也从model.ComponentSubComps列表中拉出来?

【问题讨论】:

  • 为什么在构建一个只能接受一个键和一个值的选择列表时仍然需要这么多信息?
  • 因为组件列表和子组件列表有不同的组件@DavidLiang
  • 所以你想组合组件和子组件列表并创建它们的选择列表?

标签: c# asp.net-mvc linq


【解决方案1】:

我不知道你是否要组合组件和子组件。假设它们位于数据库的单独表中并且它们的主键只是增量整数值,则将它们组合起来可能会混淆 ID。

如果不首先处理,这将成为一个严重的错误。如果它们的 ID 相同,您可能必须使用两个下拉菜单(一个用于组件,一个用于子组件)而不是一个。

如果你必须将它们结合起来,听起来你几乎必须将一些独特的东西与 ID 结合起来,将它们分配为不同的组,并在收到回发时解析 ID:

// Define the Groups
var componentGroup = new SelectListGroup { Name = "Component" };
var subComponentGroup = new SelectListGroup { Name = "SubComponent" };

var componentOptions = model.Components
    .OrderBy(x => x.ComponentName)
    .Select(x => new SelectListItem
    {
        Value = "c:" + x.CompID,
        Text = x.CompID + ":" + x.ComponentName,
        Group = componentGroup 
    });

var subComponentOptions = model.ComponentSubComps
    .OrderBy(x => x.SubCompName)
    .Select(x => new SelectListItem
    {
        Value = "sc:" + x.SubCompID,
        Text = x.SubCompID + ":" + x.SubCompName,
        Group = subComponentGroup
    });

var dropdownOptions = new List<SelectListItem>();
dropdownOptions.AddRange(componentOptions);
dropdownOptions.AddRange(subComponentOptions);

然后当用户进行选择并将下拉值发送回服务器时,您可能需要解析选定的下拉值并查看 ID 是属于组件还是子组件。


如果组件和子组件之间没有区别,那么您可以轻松地将它们组合起来:

var componentOptions = model.Components
    .OrderBy(x => x.ComponentName)
    .Select(x => new SelectListItem
    {
        Value = x.CompID,
        Text = x.CompID + ":" + x.ComponentName
    });

var subComponentOptions = model.ComponentSubComps
    .OrderBy(x => x.SubCompName)
    .Select(x => new SelectListItem
    {
        Value = x.SubCompID,
        Text = x.SubCompID + ":" + x.SubCompName
    });

// This is your SelectList. I would highly recommend you build a strongly-typed
// view model and use it instead of ViewBag.
var dropdownOptions = new List<SelectListItem>();
dropdownOptions.AddRange(componentOptions);
dropdownOptions.AddRange(subComponentOptions);

【讨论】:

  • 组件和子组件没有区别。它们只是我模型中的列表。例如,一个组件可以有“子组件”,但实际上它只是一个组件有组件。解释起来有点混乱。但我了解您可能担心的问题
【解决方案2】:

你有两个陈述。您将第一条语句的结果存储在 componentList 中,但第二条语句的结果未存储在任何地方。

尝试添加 结果 第二个声明t到componentList

可能List&lt;T&gt;.AddRange(IEnumerable&lt;T&gt;) 是最好的选择。

编辑:

var componentList = (from c in model.Components
                             select new
                             {
                                 compID = c.ID,
                                 compName = c.CompID + ":" + c.ComponentName
                             }).OrderBy(x => x.compName).ToList();

var secondResult = (from sc in model.ComponentSubComps
                            select new
                            {
                                 compID = sc.ID,
                                 compName = sc.SubCompID + ":" + sc.SubCompName
                            }).OrderBy(x => x.compName).ToList();

componentList.AddRange(secondResult);

ViewBag.Components = new SelectList(componentList, "compID", "compName");

【讨论】:

  • 如何将两个列表相加?
  • 将第二条语句的结果存储在另一个变量中(例如 secondStatementResult)。然后componentList.AddRange(secondStatementResult)
【解决方案3】:

您可以使用实体编写查询并获取:

var componentList = model.Components.Select(c => new Components
{
    compID = c.ID,
    compName = c.CompID + ":" + c.ComponentName
}).OrderBy(x => x.compName).ToList();

var componentList1 = model.ComponentSubComps.Select(c => new Components
{
    compID = c.ID,
    compName = c.SubCompID + ":" + c.SubCompName
}).OrderBy(x => x.compName).ToList();

componentList.AddRange(componentList1);
ViewBag.Components = new SelectList(componentList, "compID", "compName");

【讨论】:

    猜你喜欢
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 2018-12-15
    相关资源
    最近更新 更多