C# MVC4的下拉列表中的Optgroup?

C# MVC4的下拉列表中的Optgroup?,c#,asp.net,asp.net-mvc,asp.net-mvc-4,razor,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Razor,我需要在MVC4中的DropDownListFor中对元素进行分组 我有两个下拉列表作为团队和项目。基于团队,我得到的项目有一个表作为项目,其中包含一个名为entitytype的列。有三种实体类型:客户、任务和项目 我编写了一个查询,以获取基于团队的项目。现在我想根据entitytype对项目进行分组 例如,对于Team1,有5个项目作为2个客户、2个任务和1个项目。因此,它应该显示为: 在第一个下拉列表中: <div class="editor-label"> @

我需要在MVC4中的
DropDownListFor
中对元素进行分组

我有两个下拉列表作为团队和项目。基于团队,我得到的项目有一个表作为项目,其中包含一个名为entitytype的列。有三种实体类型:客户、任务和项目

我编写了一个查询,以获取基于团队的项目。现在我想根据entitytype对项目进行分组

例如,对于Team1,有5个项目作为2个客户、2个任务和1个项目。因此,它应该显示为:

在第一个下拉列表中:

<div class="editor-label">
         @Html.LabelFor(model => model.TeamId,"Team")
         </div>
            <div class="cssclass">
                 @Html.DropDownListFor(model => model.TeamId, new SelectList(Model.ddlTeam, "Value", "Text"), "Select Team", new { id = "TeamID", onchange = "GetProjects()", @class = "form-control", UpdateTargetId = "atag" })
              @Html.ValidationMessageFor(model => model.TeamId)
          </div>

              <div class="editor-label">
                  @Html.LabelFor(model => model.ProjectId, "Project")
               </div>
               <div class="cssclass">
                     @Html.DropDownListFor(model => model.ProjectId, new SelectList(Model.ddlProject, "Value", "Text"), "Select Project", new { id = "ProjectID", onchange = "ShowDocsList()", @class = "form-control" })
                       @Html.ValidationMessageFor(model => model.ProjectId)
                      </div>
  • 组别:组别1
在第二个下拉列表中:

<div class="editor-label">
         @Html.LabelFor(model => model.TeamId,"Team")
         </div>
            <div class="cssclass">
                 @Html.DropDownListFor(model => model.TeamId, new SelectList(Model.ddlTeam, "Value", "Text"), "Select Team", new { id = "TeamID", onchange = "GetProjects()", @class = "form-control", UpdateTargetId = "atag" })
              @Html.ValidationMessageFor(model => model.TeamId)
          </div>

              <div class="editor-label">
                  @Html.LabelFor(model => model.ProjectId, "Project")
               </div>
               <div class="cssclass">
                     @Html.DropDownListFor(model => model.ProjectId, new SelectList(Model.ddlProject, "Value", "Text"), "Select Project", new { id = "ProjectID", onchange = "ShowDocsList()", @class = "form-control" })
                       @Html.ValidationMessageFor(model => model.ProjectId)
                      </div>
  • 项目:

  • 客户
  • 客户1
  • 客户2

  • 任务:

  • 任务1
  • 任务2

  • 项目:

  • 项目1
我搜索了很多关于这方面的内容,但完全被弄糊涂了,因为我得到了很多结果,因为大多数结果都像是框架不支持任何扩展,所以应该编写自定义的

我的要求很简单:我只需要将我的查询结果分为三类,即客户机、任务下方和项目旁边。 具有entitytype客户端的一个应归入该类,其他相应的应归入该类

以下是我基于团队获取项目的代码:

 public List<Project> GetAllProjectForTeam(int teamId)
        {
            List<Project> project = new List<Project>();
            var query = (from p in db.Projects.AsEnumerable()
                             join pt in db.ProjectTeams.AsEnumerable() on p.ProjectId equals pt.ProjectId
                             join tm in db.Teams.AsEnumerable() on pt.TeamId equals tm.TeamId
                             where pt.TeamId == teamId
                             select p
                             ).ToList();

            project = query.Distinct().ToList<Project>();
            return project.ToList();
        }
公共列表GetAllProjectForTeam(int teamId)
{
列表项目=新列表();
var query=(来自db.Projects.AsEnumerable()中的p)
在p.ProjectId上的db.ProjectTeams.AsEnumerable()中加入pt等于pt.ProjectId
在pt.TeamId上的db.Teams.AsEnumerable()中加入tm等于tm.TeamId
其中pt.TeamId==TeamId
选择p
).ToList();
project=query.Distinct().ToList();
return project.ToList();
}
下面是我的razor下拉代码:

<div class="editor-label">
         @Html.LabelFor(model => model.TeamId,"Team")
         </div>
            <div class="cssclass">
                 @Html.DropDownListFor(model => model.TeamId, new SelectList(Model.ddlTeam, "Value", "Text"), "Select Team", new { id = "TeamID", onchange = "GetProjects()", @class = "form-control", UpdateTargetId = "atag" })
              @Html.ValidationMessageFor(model => model.TeamId)
          </div>

              <div class="editor-label">
                  @Html.LabelFor(model => model.ProjectId, "Project")
               </div>
               <div class="cssclass">
                     @Html.DropDownListFor(model => model.ProjectId, new SelectList(Model.ddlProject, "Value", "Text"), "Select Project", new { id = "ProjectID", onchange = "ShowDocsList()", @class = "form-control" })
                       @Html.ValidationMessageFor(model => model.ProjectId)
                      </div>

@LabelFor(model=>model.TeamId,“团队”)
@Html.DropDownListFor(model=>model.TeamId,新选择列表(model.ddlTeam,“Value”,“Text”),“Select Team”,新{id=“TeamId”,onchange=“GetProjects()”,@class=“form control”,UpdateTargetId=“atag”})
@Html.ValidationMessageFor(model=>model.TeamId)
@LabelFor(model=>model.ProjectId,“项目”)
@Html.DropDownListFor(model=>model.ProjectId,新建选择列表(model.ddlProject,“Value”,“Text”),“Select Project”,新建{id=“ProjectId”,onchange=“ShowDocsList()”,@class=“form control”})
@Html.ValidationMessageFor(model=>model.ProjectId)
所以,这就是我的问题所在。任何帮助都将不胜感激。我已经在这方面花费了很多时间,但没有任何结果。
提前感谢。

正如@EdSF所提到的,目前还没有允许dropDownList的选项组的Html帮助程序。详情:

如果您不想下载RC,您可以始终创建自己的自定义帮助程序,以添加对分组下拉列表的支持。例如:


一开始,扩展或创建自己的助手似乎让人望而生畏,但花时间和精力是值得的。如果您可以进行这种类型的定制,它可以为您节省大量的麻烦和更复杂项目的代码。

在MVC 4之前,没有添加DataGroupField这样的选项

尽管来自MVC 5,甚至在Asp.net核心中,我们有dataGroupField选项,您可以轻松地将其用于实现

供参考 对于MVC核心应用程序,您可以找到如下SELECLIAT变体

public SelectList(IEnumerable items, string dataValueField, string dataTextField, object selectedValue, string dataGroupField);
另一个建议是使用传统编码生成select元素,然后根据需要使用Multiselect jquery插件

检查此项:-

不适用于
MVC4
-在
MVC5
中,现在有一个dataGroupField。我特别相信MVC 5.2。。嗯