使用 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" })
我正在尝试在 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" })