使用 Parent/Child 个表填充 SelectList

Populating a SelectList with Parent/Child Tables

我正在尝试在 MVC 中填充 Html.DropDownList。我遇到的问题是我有一个名为 "ODSessionTopics" 的 child table,它有一个指向 "ODSessionType" table 的外键 (ID),其中包含headers 的主题。这是我的模型:

public class ODSessionTopic
{
    public int ID { get; set; }
    public string Description { get; set; }

    // foreign key
    public int ODSessionTypeID { get; set; }

    // navigation property
    public virtual ODSessionType ODSessionType { get; set; }               
}

public class ODSessionType
{
    public int ODSessionTypeID { get; set; }

    public string Description { get; set; }

    // navigation property
    public virtual ICollection<ODSessionTopic> ODSessionTopics { get; set; } 
}

我使用以下代码填充 ViewBag:

ViewBag.ODSessionTopicID = new SelectList(db.ODSessionTopics, "ID", "Description", "ODSessionTypeID", oDSession.ODSessionTopicID);

这是ODSession主题数据:

    ID           Description            ODSessionTypeID
    ---------------------------------------------------
    1            Internal Marketing     1
    2            Team Development       1
    3            Department Retreat     2
    4            Community Service      2

这是外径Session类型数据:

    ODSessionTypeID           Description
    ------------------------------------- 
    1                         Plan     
    2                         Action

这些是我的结果:

    1 
       Internal Marketing
       Team Development
    2
       Department Retreat
       Community Services

这是我想要达到的结果:

    Plans
       Internal Marketing
       Team Development
    Actions
       Department Retreat
       Community Services

查看代码为

@Html.DropDownList("ODSessionTopicID", null, "-- Session Type --", htmlAttributes: new { @class = "form-control" }) 

基本上,它在 ODSessionTopic table 中获取 ODSessionTypeID 外键并按该值分组。我需要它做的是从 ODSessionType table 中获取描述。这可能吗?主题和类型都是 editable 并且附加了 CRUD 逻辑,这就是我最初到达这个设计的方式。

您可以使用 linq .Join() 并将结果投影到匿名对象。假设 var topics = db.ODSessionTopics;var types = db.ODSessionTypes; 那么查询将是

var query = from topic in topics
            join type in types on topic.ODSessionTypeID equals type.ODSessionTypeID
            select new { Group = type.Description, ID = topic.ID, Description = topic.Description };

这将输出

{ Group: "Plan", ID: 1, Description: "Internal Marketing" }
{ Group: "Plan", ID: 2, Description: "Team Development" }
{ Group: "Action", ID: 3, Description: "Department Retreat" }
{ Group: "Action", ID: 4, Description: "Community Services" }

并创建 SelectList

ViewBag.ODSessionTopicID = new SelectList(query, "ID", "Description", "Group", oDSession.ODSessionTopicID)

旁注:建议您使用强类型 html 助手来生成您的下拉列表。您的 ViewBag 属性 不应与您绑定的 属性 同名。相反,它应该是(比如)

ViewBag.TopicList = new SelectList(query, "ID", "Description", "Group", null)

并在视图中

@Html.DropDownListFor(m => m.ODSessionTopicID, (SelectList)ViewBag.TopicList, "-- Session Type --", new { @class = "form-control" })