C# 使用OptGroup创建DropDownList

C# 使用OptGroup创建DropDownList,c#,asp.net-mvc-5.2,C#,Asp.net Mvc 5.2,我正试图从数据库中的一个表中创建一个下拉列表,该列表按同一数据库中不同表的名称分组 我有一张桌子,里面有很多单位。这些单位属于上级单位。表在父单位id上连接。因此,对于单位表,有一个属性父单位,数据类型int。父单位表有一个id数据类型int和一个名称 我要做的是创建一个下拉列表,将所有单元按父级名称分组。不幸的是,这需要发生在控制器内部,而不是模型内部 另一个问题是,下拉列表是workorder请求表单的一部分。因此,在Workorder控制器中,我需要创建一个SelectList,其中包含父

我正试图从数据库中的一个表中创建一个下拉列表,该列表按同一数据库中不同表的名称分组

我有一张桌子,里面有很多单位。这些单位属于上级单位。表在父单位id上连接。因此,对于单位表,有一个属性父单位,数据类型int。父单位表有一个id数据类型int和一个名称

我要做的是创建一个下拉列表,将所有单元按父级名称分组。不幸的是,这需要发生在控制器内部,而不是模型内部

另一个问题是,下拉列表是workorder请求表单的一部分。因此,在Workorder控制器中,我需要创建一个SelectList,其中包含父单元名称组的选项

我该怎么做呢

这就是我的想法:

ViewBag.UnitId = new SelectList(db.Units.ToList(), "Id", "Name", ParentUnit.Name);
但我不知道如何实现它,因为我是MVC新手


当我尝试
ViewBag.UnitId=new SelectList(db.Units.ToList(),“Id”,“Name”,“Parents”,1),父项的Id显示在optGroup中,我猜是因为父项单元的Id存储在Units表中。我怎样才能让家长的名字出现?

根据我的经验,首先,最好改变你的型号, 因此,您可以将两个表(模型)放在一个具有自身关系的模型中,例如,您的模型可以是:

public class Model_Name
{
public int Id { get; set; }
public string Title { get; set; }
public int ParentId { get; set; }
public Model_Name model_name { get; set; }
public ICollection<Model_Name> Model_Names{ get; set; }
}

然后,对于实现选项组,您需要获得一个数据字典,如下所示:

public Dictionary<long,List<View_Model_Name>> GetGroupAndChilds()
        {
            var result = _yourcontext.Model_Name
                .Select(x => new View_Model_Name
                {
                    ID = x.ID,
                    Title = x.Title,
                    ParentId = x.ParentId,
                    ParentTitle=x.Model_Names.Title,
                }).AsEnumerable().GroupBy(x => x.ParentId).ToList();

            return result.ToDictionary(k => k.Key, v => v.ToList());
        }
public List<SelectListItem> showlist = new List<SelectListItem>();
public List<SelectListItem> GetList()
        {
            var allList= GetGroupAndChilds();
            foreach (var (key, value) in allList)
            {

                var parentTitle = GetDetails(key).Title; //you can write a function to get title from Id
                var group = new SelectListGroup() { Name = parentTitle };
                foreach (var per in value)
                {
                    var item = new SelectListItem(per.Title, per.ID.ToString())
                    {
                        Group = group
                    };
                    showlist.Add(item);
                }

            }
公共字典GetGroupAndChilds()
{
var result=\u yourcontext.Model\u Name
.选择(x=>新视图\模型\名称
{
ID=x.ID,
Title=x.Title,
ParentId=x.ParentId,
ParentTitle=x.Model_Names.Title,
}).AsEnumerable().GroupBy(x=>x.ParentId).ToList();
返回result.ToDictionary(k=>k.Key,v=>v.ToList());
}

现在,您有了一个数据列表,可以在演示层(Razor页面)中使用它,如下所示:

public Dictionary<long,List<View_Model_Name>> GetGroupAndChilds()
        {
            var result = _yourcontext.Model_Name
                .Select(x => new View_Model_Name
                {
                    ID = x.ID,
                    Title = x.Title,
                    ParentId = x.ParentId,
                    ParentTitle=x.Model_Names.Title,
                }).AsEnumerable().GroupBy(x => x.ParentId).ToList();

            return result.ToDictionary(k => k.Key, v => v.ToList());
        }
public List<SelectListItem> showlist = new List<SelectListItem>();
public List<SelectListItem> GetList()
        {
            var allList= GetGroupAndChilds();
            foreach (var (key, value) in allList)
            {

                var parentTitle = GetDetails(key).Title; //you can write a function to get title from Id
                var group = new SelectListGroup() { Name = parentTitle };
                foreach (var per in value)
                {
                    var item = new SelectListItem(per.Title, per.ID.ToString())
                    {
                        Group = group
                    };
                    showlist.Add(item);
                }

            }
public List showlist=new List();
公共列表GetList()
{
var allList=GetGroupAndChilds();
foreach(allList中的var(键、值)
{
var parentTitle=GetDetails(key).Title;//您可以编写一个函数从Id获取标题
var group=new SelectListGroup(){Name=parentTitle};
foreach(每个值的var)
{
var item=new SelectListItem(per.Title,per.ID.ToString())
{
组=组
};
显示列表。添加(项目);
}
}

最后,将下面的标签添加到cshtml(视图)页面


完成