2

我正在尝试在 MVC 中填充 Html.DropDownList。我遇到的问题是我有一个名为“ODSessionTopics”的子表,它具有“ODSessionType”表的外键(ID),其中包含主题的标题。这是我的模型:

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);

这是 OD 会话主题数据:

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

这是 OD 会话类型数据:

    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 表中获取 ODSessionTypeID 外键并按该值分组。我需要它做的是从 ODSessionType 表中获取描述。这可能吗?主题和类型都是可编辑的,并且附加了 CRUD 逻辑,这就是我最初到达此设计的方式。

4

1 回答 1

1

您可以使用 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" }) 
于 2015-10-31T01:36:46.590 回答