在我的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)
});
分组在这里完成,但我想以不同的方式进行分组。这样我就可以绑定下拉列表,如下所示:
现在让我讲述我的表结构。我有一个表具有以下结构:
这里我有一个层次结构,以便客户 - >客户 - >项目。因此,我需要按客户分组,以便所有项目都应列在客户端下。我想要这样的东西:
因此我一直坚持在这里查询,实现这个的查询。我需要在组名中显示所有客户名称,并且我需要列出所有相应项目的客户。我想我很清楚我的要求。被困在这里,所以任何帮助都会很棒。谢谢。
答案 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()
});
然后绑定您的下拉列表。祝你好运......