2015-10-30 4 views
2

Я пытаюсь заполнить Html.DropDownList в MVC. Проблема, с которой я сталкиваюсь, заключается в том, что у меня есть дочерняя таблица с именем «ODSessionTopics», которая имеет внешний ключ (ID) в таблице «ODSessionType», которая содержит заголовки для тем. Вот мои модели:Заполнение SelectList родительскими/дочерними таблицами

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 Session Тема:

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" }) 

В основном, это захват внешнего ключа ODSessionTypeID в ODSessionTopic table и группировка по этому значению. Что мне нужно, так это захватить описание из таблицы ODSessionType. Это возможно? Как темы, так и типы редактируются, и к ним привязана CRUD-логика, и именно так я пришел к этому дизайну в первую очередь.

+0

Какой результат будут ваши желания? Если вы просто хотите отобразить 4 элемента, не сгруппированных, то это должен быть 'new SelectList (db.ODSessionTopics,« ID »,« Описание »)', но неясно, какое свойство модели вы пытаетесь связать (показать, как вы генерируете раскрывающийся список в представлении. И что вы подразумеваете под _grab описанием из таблицы ODSessionType_? –

+0

Я хочу, чтобы выпадающее меню отображало результаты из таблицы ODSessionTopic (показано правильно на изображении выше) и заголовков (ODSessionType. Описание) из таблицы ODSessionType. Таблицы связаны внешним ключом ODSessionTypeID, поэтому я хочу, чтобы раскрывающийся список в основном запрашивал таблицу ODSessionType с помощью ODSessionTypeID и сопоставлял ее с описанием (ODSessionType.Description). Вот выпадающий код: Html.DropDownList ("ODSessionTopicID", null, "- Тип сеанса -", htmlAttributes: new {@class = "form-control"}) –

+0

Редактировать вопрос с помощью вашего кода. Все еще не имеет смысла. Что такое 'oDSession.ODSessionTopicID' (ни одна из ваших моделей не имеет свойства с именем' ODSessionTopicID') И какое свойство вы пытаетесь связать? –

ответ

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) 

Side Примечание: рекомендуется использовать сильно типизированных 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" }) 
+0

Это работает! Стивен, ты гений. Большое спасибо за вашу помощь, должен оценить! –

+0

Сделано! Еще раз спасибо за помощь noobie! –