Menggunakan bantuan Tag Pilih untuk merender elemen SELECT
Dalam tindakan GET Anda, buat objek model tampilan Anda, muat EmployeeListproperti koleksi dan kirimkan ke tampilan.
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);
}
Dan di tampilan buat Anda, buat SelectListobjek baru dari EmployeeListproperti dan berikan itu sebagai nilai untuk asp-itemsproperti.
@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>
Dan metode tindakan HttpPost Anda untuk menerima data formulir yang dikirimkan.
[HttpPost]
public IActionResult Create(MyViewModel model)
{
// check model.EmployeeId
// to do : Save and redirect
}
Atau
Jika model tampilan Anda memiliki List<SelectListItem>sebagai properti untuk item dropdown Anda.
public class MyViewModel
{
public int EmployeeId { get; set; }
public string Comments { get; set; }
public List<SelectListItem> Employees { set; get; }
}
Dan dalam tindakan Anda,
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);
}
Dan dalam tampilan, Anda dapat langsung menggunakan Employeesproperti untuk 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>
Kelas SelectListItemmilik Microsoft.AspNet.Mvc.Renderingnamespace.
Pastikan Anda menggunakan tag penutup eksplisit untuk elemen pilih. Jika Anda menggunakan pendekatan tag penutup diri, tag helper akan membuat elemen SELECT kosong!
Pendekatan di bawah ini tidak akan berhasil
<select asp-for="EmployeeId" asp-items="@Model.Employees" />
Tetapi ini akan berhasil.
<select asp-for="EmployeeId" asp-items="@Model.Employees"></select>
Mendapatkan data dari tabel database Anda menggunakan framework entitas
Contoh di atas menggunakan item kode keras untuk opsi. Jadi saya pikir saya akan menambahkan beberapa kode sampel untuk mendapatkan data menggunakan kerangka kerja Entity karena banyak orang menggunakannya.
Mari kita asumsikan objek DbContext Anda memiliki properti yang disebut Employees, yang merupakan tipe di DbSet<Employee>mana Employeekelas entitas memiliki Iddan Nameproperti seperti ini
public class Employee
{
public int Id { set; get; }
public string Name { set; get; }
}
Anda bisa menggunakan kueri LINQ untuk mendapatkan karyawan dan menggunakan metode Pilih dalam ekspresi LINQ Anda untuk membuat daftar SelectListItemobjek untuk setiap karyawan.
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);
}
Dengan asumsi contextadalah objek konteks db Anda. Kode tampilan sama seperti di atas.
Menggunakan SelectList
Beberapa orang lebih suka menggunakan SelectListkelas untuk menyimpan item yang diperlukan untuk memberikan opsi.
public class MyViewModel
{
public int EmployeeId { get; set; }
public SelectList Employees { set; get; }
}
Sekarang dalam tindakan GET Anda, Anda bisa menggunakan SelectListkonstruktor untuk mengisi Employeesproperti model tampilan. Pastikan Anda menentukan parameter dataValueFielddan 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" }
};
}
Di sini saya memanggil GetEmployeesmetode untuk mendapatkan daftar objek Karyawan, masing-masing dengan Iddan FirstNameproperti dan saya menggunakan properti tersebut sebagai DataValueFielddan DataTextFielddari SelectListobjek yang kami buat. Anda dapat mengubah daftar hardcoded ke kode yang membaca data dari tabel database.
Kode tampilan akan sama.
<select asp-for="EmployeeId" asp-items="@Model.Employees" >
<option>Please select one</option>
</select>
Render elemen SELECT dari daftar string.
Kadang-kadang Anda mungkin ingin membuat elemen pilih dari daftar string. Dalam hal ini, Anda dapat menggunakan SelectListkonstruktor yang hanya dibutuhkanIEnumerable<T>
var vm = new MyViewModel();
var items = new List<string> {"Monday", "Tuesday", "Wednesday"};
vm.Employees = new SelectList(items);
return View(vm);
Kode tampilan akan sama.
Pengaturan opsi yang dipilih
Beberapa kali, Anda mungkin ingin menetapkan satu opsi sebagai opsi default di elemen SELECT (Misalnya, di layar edit, Anda ingin memuat nilai opsi yang disimpan sebelumnya). Untuk melakukan itu, Anda cukup mengatur nilai EmployeeIdproperti ke nilai opsi yang ingin Anda pilih.
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);
}
Ini akan memilih opsi Tom di elemen pilih ketika halaman diberikan.
Dropdown multi pilih
Jika Anda ingin merender dropdown multi pilih, Anda cukup mengubah properti model tampilan yang Anda gunakan untuk asp-foratribut dalam tampilan Anda menjadi tipe array.
public class MyViewModel
{
public int[] EmployeeIds { get; set; }
public List<SelectListItem> Employees { set; get; }
}
Ini akan membuat markup HTML untuk elemen pilih dengan multipleatribut yang akan memungkinkan pengguna untuk memilih beberapa opsi.
@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>
Pengaturan opsi yang dipilih dalam multi pilih
Mirip dengan pemilihan tunggal, atur nilai EmployeeIdsproperti ke array nilai yang Anda inginkan.
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);
}
Ini akan memilih opsi Tom and Jerry di elemen multi-pilih ketika halaman diberikan.
Menggunakan ViewBag untuk mentransfer daftar item
Jika Anda tidak memilih untuk menyimpan properti tipe koleksi untuk meneruskan daftar opsi ke tampilan, Anda dapat menggunakan ViewBag dinamis untuk melakukannya. ( Ini bukan pendekatan yang saya sarankan secara pribadi karena viewbag dinamis dan kode Anda cenderung tidak ditambal kesalahan ketik )
public IActionResult Create()
{
ViewBag.Employees = new List<SelectListItem>
{
new SelectListItem {Text = "Shyju", Value = "1"},
new SelectListItem {Text = "Sean", Value = "2"}
};
return View(new MyViewModel());
}
dan dalam tampilan
<select asp-for="EmployeeId" asp-items="@ViewBag.Employees">
<option>Please select one</option>
</select>
Menggunakan ViewBag untuk mentransfer daftar item dan mengatur opsi yang dipilih
Sama seperti di atas. Yang harus Anda lakukan adalah, atur nilai properti (yang Anda ikatkan dropdown untuk) ke nilai opsi yang ingin Anda pilih.
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());
}
dan dalam tampilan
<select asp-for="EmployeeId" asp-items="@ViewBag.Employees">
<option>Please select one</option>
</select>
Mengelompokkan item
Metode tag pembantu pilih mendukung opsi pengelompokan dalam dropdown. Yang harus Anda lakukan adalah, tentukan nilai Groupproperti masing-masing SelectListItemdalam metode tindakan Anda.
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);
}
Tidak ada perubahan dalam kode tampilan. pembantu tag pilih sekarang akan memberikan opsi di dalam 2 item grup optg .