Optgroup for MVC 4中的下拉列表

时间:2014-09-26 03:46:44

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

在我的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)
                      });

分组在这里完成,但我想以不同的方式进行分组。这样我就可以绑定下拉列表,如下所示:

enter image description here

现在让我讲述我的表结构。我有一个表具有以下结构:

enter image description here

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

enter image description here

因此我一直坚持在这里查询,实现这个的查询。我需要在组名中显示所有客户名称,并且我需要列出所有相应项目的客户。我想我很清楚我的要求。被困在这里,所以任何帮助都会很棒。谢谢。

1 个答案:

答案 0 :(得分: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()
                      });

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