2015-09-05 2 views
-1

У меня есть три раскрывающихся коробки на мой взгляд, с кодомКак фильтровать выпадающие ящики на основе MVC

@Html.DropDownList("EventGroupTitle", ViewData["groupList"] as List<SelectListItem>, new { @class = "form-control" }) 
@Html.DropDownList("EventGroupName", ViewData["groupNameList"] as List<SelectListItem>, new { @class = "form-control" }) 
@Html.DropDownList("EventTypeOne", ViewData["typeList"] as List<SelectListItem>, new { @class = "form-control" }) 

И мой контроллер метод GET действий является

public ActionResult Create() 
    { 
     List<SelectListItem> liEventGroups = new List<SelectListItem>(); 
     List<SelectListItem> liEventTypes = new List<SelectListItem>(); 
     List<SelectListItem> liEventGroupNames = new List<SelectListItem>(); 

     // pull results from DB and assign them to the above variables   

     ViewData["typeList"] = liEventTypes; 
     ViewData["groupList"] = liEventGroups; 
     ViewData["groupNameList"] = liEventGroupNames; 
     return View(); 
    } 

В базе данных есть один -to-many между EventGroupTitle и EventGroupNames. В качестве примера название группы может быть Doctor, а имена групп будут Dr Joe, Dr Adrian. Другим названием группы будет Nurse, и поэтому имена групп будут Nurse Daniel, Nurse Dave.

Нет фактической настройки внешнего ключа, однако есть поле в GroupNames, которое говорит, что такое title.

Итак, есть ли способ сделать какую-то фильтрацию на Dropbox? Если они выбирают Doctor в первом Dropbox, то я хочу, чтобы во втором Dropbox появлялись только врачи.

+0

Для обработки событий на стороне клиента вам нужен javascript/jquery. Найдите каскадные каскадные кадры MVC или посмотрите на это [DotNetFiddle] (https://dotnetfiddle.net/JofdB8) для примера –

+0

Есть ли другая функция, чем 'append'. Когда страница загружается, все возможные варианты присутствуют в dropdownbox 2. Когда они меняют что-то в dropdownbox 1, ваш код работает так, как ожидалось, но добавляет его ко второму полю. Есть ли способ переписать весь dropdownbox? – masfenix

+0

Посмотрите на пример - вам нужен ajax, чтобы вызвать метод сервера, чтобы заполнить второй раскрывающийся список на основе значения первого (выпадающее меню secons должно изначально быть пустым). Или, если вы хотите сначала загрузить все параметры всех параметров для второго раскрывающегося списка и сделать это без ajax, посмотрите последнюю опцию в [этот ответ] (http://stackoverflow.com/questions/28627421/better-way-to- load-2-dropdown-in-mvc/28640420 # 28640420) –

ответ

0

Я создал каскадное выпадающее меню html, которое может быть полезно здесь. Он доступен как nuget package, а исходный код с тестами находится на github.

Использование очень простое. Например у вас есть Страна, в город выпадающие со следующей моделью:

Модель:

public class Model 
{ 
    public int SelectedCountry {get;set;} 
    public IList<SelectListItem> Countries {get;set;} 
    public int SelectedCity {get;set;} 
} 

Контроллер

public ActionResult GetCities(int country) 
{ 
    //return IList<SelectListItem> of Cities based on a country that you get as a parameter 
} 

Посмотреть

//First simple dropdown 
@Html.DropDownListFor(m=>m.SelectedCountry, Model.Countries, 
"Please select a Country", new {@class="form-control"}) 

//Dropdown list for SelectedCity property that depends on selection of SelectedCountry property 
@Html.CascadingDropDownListFor( 
     expression: m => m.SelectedCity, 
     triggeredByProperty: m => m.SelectedCountry, //Parent property that trigers dropdown data loading 
     url: Url.Action("GetCities", "Home"), //Url of action that returns dropdown data 
     actionParam: "country", //Parameter name for the selected parent value that url action receives 
     optionLabel: "Please select a City", // Option label 
     disabledWhenParrentNotSelected: true, //If true, disables dropdown until parrent dropdown selected 
     htmlAttributes: new { @class = "form-control" }) //Html attributes 
Смежные вопросы