【问题标题】:Optgroup for dropdownlist in MVC 4MVC 4 中下拉列表的 Optgroup
【发布时间】:2014-09-26 03:46:44
【问题描述】:

在我的 MVC 4 应用程序中,我正在寻找用于下拉列表的 optgroup,发现 this 非常有用。

我也按照这些步骤实现了这一点,但目前我遇到了一些问题。我的控制器代码如下所示:

Model.ddlProject = db.Projects.OrderBy(t => t.Type)
                    .Select(t => new GroupedSelectListItem
                     {
                       GroupName = t.Type,
                       Text = t.Name,
                       Value = SqlFunctions.StringConvert((decimal)t.Id)
                      });

分组在这里完成,但我想要以不同的方式。有了这个我可以绑定下拉列表,如下所示:

现在让我介绍一下我的表结构。我有一张表,结构如下:

这里我有一个层次结构,例如 Customer -> Client -> Projects 。因此,我需要按客户分组,以便所有项目都应列在客户下。我想要这样的东西:

因此我一直在这里查询,实现此目的的查询。我需要在组名中显示所有客户名称,对于客户,我需要列出所有相应的项目。我想我很清楚我的要求。有点卡在这里,所以任何帮助都会很棒。在此先感谢。

【问题讨论】:

  • 你真的应该考虑重组你的数据库表。项目和客户是两个不同的东西。您应该有一个 Client 表和一个单独的 Project 表,其中包含一个具有 Client 表外键的列。
  • 我想知道这种情况,我确实需要不同的表,但我不应该更改数据库结构。那么有没有可能在不更改数据库的情况下实现这一点的方法。感谢您的快速响应.
  • 可能不会。我看不到任何分组数据的方式。您可以创建自己的类来表示层次结构并遍历每一行以分配值,但为什么要麻烦。只需正确创建数据库即可。
  • @Saroj:检查我的答案...

标签: sql-server linq asp.net-mvc-4 linq-to-entities


【解决方案1】:

正如 Stephen Muecke 在评论部分所说,项目和客户是两个不同的东西。您应该有一个 Client 表和一个单独的 Project 表,其中包含一个具有 Client 表外键的列。所以下面的解决方案是根据你现有的表结构。

虚拟架构

DECLARE @clientprj TABLE ([id] int identity(1,1), [name] varchar(30), Desc1 varchar(30), ParentId int, pType varchar(30));

INSERT @clientprj ([name], Desc1, ParentId, pType) VALUES ('client1', '', 0, 'clt'), ('prj1', '', 1, 'prj'), ('prj2', '', 1, 'prj'), ('client2', '', 0, 'clt'), ('prj n', '', 4, 'prj')

这是查询

SELECT GroupName, GroupKey, ProjName, ProjId
FROM 
(
    (
        SELECT NAME AS GroupName
            ,Id AS GroupKey
        FROM @clientprj m
        WHERE ParentId = 0
        ) m 
    FULL OUTER JOIN 
    (
        SELECT NAME AS ProjName
            ,Id AS ProjId
            ,ParentId
        FROM @clientprj
    ) 
    t ON m.GroupKey = t.ParentId
)
WHERE ParentId <> 0

返回以下输出。

GroupName   GroupKey    ProjName    ProjId
client1       1           prj1           2
client1       1           prj2           3
client2       4           prj n          5

以及像这样调用此查询的控制器方法 -

Model.ddlProject = db.NewMethod
                    .Select(t => new GroupedSelectListItem
                     {
                       GroupName = t.GroupName,
                       GroupKey = t.GroupKey.ToString(),
                       Text = t.ProjName,
                       Value = t.ProjId.ToString()
                      });

然后绑定您的下拉列表。祝你好运...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    相关资源
    最近更新 更多