Menggunakan bantuan Tag Pilih untuk merender elemen SELECT
Dalam tindakan GET Anda, buat objek model tampilan Anda, muat EmployeeList
properti 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 SelectList
objek baru dari EmployeeList
properti dan berikan itu sebagai nilai untuk asp-items
properti.
@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 Employees
properti 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 SelectListItem
milik Microsoft.AspNet.Mvc.Rendering
namespace.
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 Employee
kelas entitas memiliki Id
dan Name
properti 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 SelectListItem
objek 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 context
adalah objek konteks db Anda. Kode tampilan sama seperti di atas.
Menggunakan SelectList
Beberapa orang lebih suka menggunakan SelectList
kelas 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 SelectList
konstruktor untuk mengisi Employees
properti model tampilan. Pastikan Anda menentukan parameter dataValueField
dan 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 GetEmployees
metode untuk mendapatkan daftar objek Karyawan, masing-masing dengan Id
dan FirstName
properti dan saya menggunakan properti tersebut sebagai DataValueField
dan DataTextField
dari SelectList
objek 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 SelectList
konstruktor 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 EmployeeId
properti 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-for
atribut 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 multiple
atribut 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 EmployeeIds
properti 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 Group
properti masing-masing SelectListItem
dalam 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 .