Używanie pomocników Select Tag do renderowania elementu SELECT
W akcji GET utwórz obiekt swojego modelu widoku, załaduj EmployeeList
właściwość kolekcji i wyślij ją do widoku.
public IActionResult Create()
{
var vm = new MyViewModel();
vm.EmployeesList = new List<Employee>
{
new Employee { Id = 1, FullName = "Shyju" },
new Employee { Id = 2, FullName = "Bryan" }
};
return View(vm);
}
W widoku tworzenia utwórz nowy SelectList
obiekt z EmployeeList
właściwości i przekaż go jako wartość asp-items
właściwości.
@model MyViewModel
<form asp-controller="Home" asp-action="Create">
<select asp-for="EmployeeId"
asp-items="@(new SelectList(Model.EmployeesList,"Id","FullName"))">
<option>Please select one</option>
</select>
<input type="submit"/>
</form>
Oraz metodę akcji HttpPost, aby zaakceptować przesłane dane formularza.
[HttpPost]
public IActionResult Create(MyViewModel model)
{
// check model.EmployeeId
// to do : Save and redirect
}
Lub
Jeśli Twój model widoku ma List<SelectListItem>
właściwość elementów listy rozwijanej.
public class MyViewModel
{
public int EmployeeId { get; set; }
public string Comments { get; set; }
public List<SelectListItem> Employees { set; get; }
}
A w twojej akcji get,
public IActionResult Create()
{
var vm = new MyViewModel();
vm.Employees = new List<SelectListItem>
{
new SelectListItem {Text = "Shyju", Value = "1"},
new SelectListItem {Text = "Sean", Value = "2"}
};
return View(vm);
}
W widoku możesz bezpośrednio użyć Employees
właściwości dla asp-items
.
@model MyViewModel
<form asp-controller="Home" asp-action="Create">
<label>Comments</label>
<input type="text" asp-for="Comments"/>
<label>Lucky Employee</label>
<select asp-for="EmployeeId" asp-items="@Model.Employees" >
<option>Please select one</option>
</select>
<input type="submit"/>
</form>
Klasa SelectListItem
należy do Microsoft.AspNet.Mvc.Rendering
przestrzeni nazw.
Upewnij się, że używasz wyraźnego tagu zamykającego dla elementu select. Jeśli używasz samozamykającego się tagu, pomocnik tagu wyrenderuje pusty element SELECT!
Poniższe podejście nie zadziała
<select asp-for="EmployeeId" asp-items="@Model.Employees" />
Ale to zadziała.
<select asp-for="EmployeeId" asp-items="@Model.Employees"></select>
Pobieranie danych z tabeli bazy danych przy użyciu struktury encji
Powyższe przykłady używają elementów zakodowanych na stałe dla opcji. Pomyślałem więc, że dodam przykładowy kod, aby uzyskać dane za pomocą frameworka Entity, ponieważ wiele osób z niego korzysta.
Załóżmy, że Twój obiekt DbContext ma właściwość o nazwie Employees
, która jest typu, w DbSet<Employee>
którym Employee
klasa jednostki ma właściwość Id
i Name
taką jak ta
public class Employee
{
public int Id { set; get; }
public string Name { set; get; }
}
Możesz użyć zapytania LINQ, aby pobrać pracowników i użyć metody Select w wyrażeniu LINQ, aby utworzyć listę SelectListItem
obiektów dla każdego pracownika.
public IActionResult Create()
{
var vm = new MyViewModel();
vm.Employees = context.Employees
.Select(a => new SelectListItem() {
Value = a.Id.ToString(),
Text = a.Name
})
.ToList();
return View(vm);
}
Zakładając, że context
jest to obiekt kontekstu db. Kod widoku jest taki sam jak powyżej.
Korzystanie z SelectList
Niektórzy wolą używać SelectList
klasy do przechowywania elementów potrzebnych do renderowania opcji.
public class MyViewModel
{
public int EmployeeId { get; set; }
public SelectList Employees { set; get; }
}
Teraz w akcji GET możesz użyć SelectList
konstruktora do wypełnienia Employees
właściwości modelu widoku. Upewnij się, że określasz parametry dataValueField
i dataTextField
.
public IActionResult Create()
{
var vm = new MyViewModel();
vm.Employees = new SelectList(GetEmployees(),"Id","FirstName");
return View(vm);
}
public IEnumerable<Employee> GetEmployees()
{
// hard coded list for demo.
// You may replace with real data from database to create Employee objects
return new List<Employee>
{
new Employee { Id = 1, FirstName = "Shyju" },
new Employee { Id = 2, FirstName = "Bryan" }
};
}
Ja tu wywołanie GetEmployees
metody, aby uzyskać listę obiektów pracownicze, każdy z Id
i FirstName
mienia i używam tych właściwości, jak DataValueField
i DataTextField
na SelectList
obiekcie stworzyliśmy. Możesz zmienić zakodowaną listę na kod, który odczytuje dane z tabeli bazy danych.
Kod widoku będzie taki sam.
<select asp-for="EmployeeId" asp-items="@Model.Employees" >
<option>Please select one</option>
</select>
Renderuj element SELECT z listy ciągów.
Czasami możesz chcieć wyrenderować wybrany element z listy ciągów. W takim przypadku możesz użyć SelectList
konstruktora, który zajmuje tylko plikiIEnumerable<T>
var vm = new MyViewModel();
var items = new List<string> {"Monday", "Tuesday", "Wednesday"};
vm.Employees = new SelectList(items);
return View(vm);
Kod widoku będzie taki sam.
Ustawianie wybranych opcji
Czasami możesz chcieć ustawić jedną opcję jako opcję domyślną w elemencie SELECT (na przykład na ekranie edycji chcesz załadować poprzednio zapisaną wartość opcji). Aby to zrobić, możesz po prostu ustawić EmployeeId
wartość właściwości na wartość opcji, którą chcesz wybrać.
public IActionResult Create()
{
var vm = new MyViewModel();
vm.Employees = new List<SelectListItem>
{
new SelectListItem {Text = "Shyju", Value = "11"},
new SelectListItem {Text = "Tom", Value = "12"},
new SelectListItem {Text = "Jerry", Value = "13"}
};
vm.EmployeeId = 12; // Here you set the value
return View(vm);
}
Spowoduje to wybranie opcji Tom w elemencie select, gdy strona jest renderowana.
Lista rozwijana wielokrotnego wyboru
Jeśli chcesz renderować listę rozwijaną wielokrotnego wyboru, możesz po prostu zmienić właściwość modelu widoku, której używasz dla asp-for
atrybutu w widoku, na typ tablicy.
public class MyViewModel
{
public int[] EmployeeIds { get; set; }
public List<SelectListItem> Employees { set; get; }
}
Spowoduje to renderowanie znaczników HTML dla elementu select z multiple
atrybutem, który pozwoli użytkownikowi wybrać wiele opcji.
@model MyViewModel
<select id="EmployeeIds" multiple="multiple" name="EmployeeIds">
<option>Please select one</option>
<option value="1">Shyju</option>
<option value="2">Sean</option>
</select>
Ustawianie wybranych opcji w trybie wielokrotnego wyboru
Podobnie jak w przypadku wyboru pojedynczego, ustaw EmployeeIds
wartość właściwości na tablicę żądanych wartości.
public IActionResult Create()
{
var vm = new MyViewModel();
vm.Employees = new List<SelectListItem>
{
new SelectListItem {Text = "Shyju", Value = "11"},
new SelectListItem {Text = "Tom", Value = "12"},
new SelectListItem {Text = "Jerry", Value = "13"}
};
vm.EmployeeIds= new int[] { 12,13} ;
return View(vm);
}
Spowoduje to wybranie opcji Tom i Jerry w elemencie wielokrotnego wyboru podczas renderowania strony.
Używanie ViewBag do przesyłania listy elementów
Jeśli nie wolisz zachować właściwości typu kolekcji, aby przekazać listę opcji do widoku, możesz użyć dynamicznego ViewBag, aby to zrobić ( nie jest to moje osobiście zalecane podejście, ponieważ obszar widoku jest dynamiczny, a kod jest podatny na literówki )
public IActionResult Create()
{
ViewBag.Employees = new List<SelectListItem>
{
new SelectListItem {Text = "Shyju", Value = "1"},
new SelectListItem {Text = "Sean", Value = "2"}
};
return View(new MyViewModel());
}
i w widoku
<select asp-for="EmployeeId" asp-items="@ViewBag.Employees">
<option>Please select one</option>
</select>
Używanie ViewBag do przenoszenia listy elementów i ustawiania wybranej opcji
Tak samo jak powyżej. Wszystko, co musisz zrobić, to ustawić wartość właściwości (dla której wiążesz listę rozwijaną) na wartość opcji, którą chcesz wybrać.
public IActionResult Create()
{
ViewBag.Employees = new List<SelectListItem>
{
new SelectListItem {Text = "Shyju", Value = "1"},
new SelectListItem {Text = "Bryan", Value = "2"},
new SelectListItem {Text = "Sean", Value = "3"}
};
vm.EmployeeId = 2; // This will set Bryan as selected
return View(new MyViewModel());
}
i w widoku
<select asp-for="EmployeeId" asp-items="@ViewBag.Employees">
<option>Please select one</option>
</select>
Grupowanie elementów
Metoda pomocnika wyboru tagów obsługuje opcje grupowania w menu rozwijanym. Wszystko, co musisz zrobić, to określić Group
wartość właściwości każdego z nich SelectListItem
w swojej metodzie akcji.
public IActionResult Create()
{
var vm = new MyViewModel();
var group1 = new SelectListGroup { Name = "Dev Team" };
var group2 = new SelectListGroup { Name = "QA Team" };
var employeeList = new List<SelectListItem>()
{
new SelectListItem() { Value = "1", Text = "Shyju", Group = group1 },
new SelectListItem() { Value = "2", Text = "Bryan", Group = group1 },
new SelectListItem() { Value = "3", Text = "Kevin", Group = group2 },
new SelectListItem() { Value = "4", Text = "Alex", Group = group2 }
};
vm.Employees = employeeList;
return View(vm);
}
Nie ma zmian w kodzie widoku. pomocnik tagów wyboru będzie teraz renderował opcje wewnątrz 2 elementów optgroup .