Sử dụng trình trợ giúp Chọn thẻ để hiển thị phần tử CHỌN
Trong hành động GET của bạn, tạo một đối tượng của mô hình khung nhìn của bạn, tải thuộc tính EmployeeList
bộ sưu tập và gửi nó đến khung nhìn.
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);
}
Và trong chế độ tạo của bạn, tạo một SelectList
đối tượng mới từ thuộc EmployeeList
tính và chuyển giá trị đó làm giá trị cho thuộc asp-items
tính.
@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>
Và phương thức hành động HttpPost của bạn để chấp nhận dữ liệu biểu mẫu đã gửi.
[HttpPost]
public IActionResult Create(MyViewModel model)
{
// check model.EmployeeId
// to do : Save and redirect
}
Hoặc là
Nếu mô hình xem của bạn có một List<SelectListItem>
thuộc tính cho các mục thả xuống của bạn.
public class MyViewModel
{
public int EmployeeId { get; set; }
public string Comments { get; set; }
public List<SelectListItem> Employees { set; get; }
}
Và trong hành động nhận được của bạn,
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);
}
Và trong chế độ xem, bạn có thể trực tiếp sử dụng Employees
tài sản cho 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>
Lớp SelectListItem
thuộc về Microsoft.AspNet.Mvc.Rendering
không gian tên.
Hãy chắc chắn rằng bạn đang sử dụng thẻ đóng rõ ràng cho phần tử chọn. Nếu bạn sử dụng phương pháp tiếp cận thẻ tự đóng, trình trợ giúp thẻ sẽ hiển thị phần tử CHỌN trống!
Cách tiếp cận dưới đây sẽ không hoạt động
<select asp-for="EmployeeId" asp-items="@Model.Employees" />
Nhưng điều này sẽ làm việc.
<select asp-for="EmployeeId" asp-items="@Model.Employees"></select>
Lấy dữ liệu từ bảng cơ sở dữ liệu của bạn bằng khung thực thể
Các ví dụ trên đang sử dụng các mục được mã hóa cứng cho các tùy chọn. Vì vậy, tôi nghĩ rằng tôi sẽ thêm một số mã mẫu để lấy dữ liệu bằng khung Entity vì nhiều người sử dụng nó.
Giả sử đối tượng DbContext của bạn có một thuộc tính được gọi Employees
, thuộc loại DbSet<Employee>
mà Employee
lớp thực thể có Id
và thuộc Name
tính như thế này
public class Employee
{
public int Id { set; get; }
public string Name { set; get; }
}
Bạn có thể sử dụng truy vấn LINQ để nhận nhân viên và sử dụng phương thức Chọn trong biểu thức LINQ của bạn để tạo danh sách các SelectListItem
đối tượng cho mỗi nhân viên.
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);
}
Giả sử context
là đối tượng bối cảnh db của bạn. Mã xem giống như trên.
Sử dụng Chọn danh sách
Một số người thích sử dụng SelectList
lớp để giữ các mục cần thiết để hiển thị các tùy chọn.
public class MyViewModel
{
public int EmployeeId { get; set; }
public SelectList Employees { set; get; }
}
Bây giờ trong hành động GET của bạn, bạn có thể sử dụng hàm SelectList
tạo để điền vào thuộc Employees
tính của mô hình khung nhìn. Hãy chắc chắn rằng bạn đang chỉ định dataValueField
và dataTextField
các tham số.
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" }
};
}
Ở đây tôi đang gọi GetEmployees
phương thức để lấy danh sách các đối tượng Nhân viên, mỗi đối tượng có một Id
và thuộc FirstName
tính và tôi sử dụng các thuộc tính đó như DataValueField
và DataTextField
của SelectList
đối tượng chúng ta đã tạo. Bạn có thể thay đổi danh sách mã hóa cứng thành mã đọc dữ liệu từ bảng cơ sở dữ liệu.
Mã xem sẽ giống nhau.
<select asp-for="EmployeeId" asp-items="@Model.Employees" >
<option>Please select one</option>
</select>
Kết xuất phần tử CHỌN từ danh sách các chuỗi.
Đôi khi bạn có thể muốn kết xuất một phần tử được chọn từ danh sách các chuỗi. Trong trường hợp đó, bạn có thể sử dụng hàm SelectList
tạo chỉ mấtIEnumerable<T>
var vm = new MyViewModel();
var items = new List<string> {"Monday", "Tuesday", "Wednesday"};
vm.Employees = new SelectList(items);
return View(vm);
Mã xem sẽ giống nhau.
Đặt tùy chọn đã chọn
Đôi khi, bạn có thể muốn đặt một tùy chọn làm tùy chọn mặc định trong phần tử CHỌN (Ví dụ: trong màn hình chỉnh sửa, bạn muốn tải giá trị tùy chọn đã lưu trước đó). Để làm điều đó, bạn có thể chỉ cần đặt EmployeeId
giá trị thuộc tính thành giá trị của tùy chọn bạn muốn được chọn.
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);
}
Điều này sẽ chọn tùy chọn Tom trong phần tử chọn khi trang được hiển thị.
Thả xuống nhiều lựa chọn
Nếu bạn muốn hiển thị danh sách thả xuống đa lựa chọn, bạn chỉ cần thay đổi asp-for
thuộc tính mô hình chế độ xem mà bạn sử dụng cho thuộc tính trong chế độ xem thành loại mảng.
public class MyViewModel
{
public int[] EmployeeIds { get; set; }
public List<SelectListItem> Employees { set; get; }
}
Điều này sẽ hiển thị đánh dấu HTML cho phần tử chọn với multiple
thuộc tính cho phép người dùng chọn nhiều tùy chọn.
@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>
Đặt tùy chọn đã chọn trong đa lựa chọn
Tương tự như chọn đơn, đặt EmployeeIds
giá trị thuộc tính thành một mảng các giá trị bạn muốn.
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);
}
Điều này sẽ chọn tùy chọn Tom và Jerry trong phần tử đa lựa chọn khi trang được hiển thị.
Sử dụng ViewBag để chuyển danh sách các mục
Nếu bạn không muốn giữ thuộc tính loại bộ sưu tập để chuyển danh sách các tùy chọn cho chế độ xem, bạn có thể sử dụng ViewBag động để làm như vậy ( Đây không phải là cách tiếp cận được đề xuất của cá nhân tôi vì viewbag là động và mã của bạn dễ bị hủy lỗi đánh máy )
public IActionResult Create()
{
ViewBag.Employees = new List<SelectListItem>
{
new SelectListItem {Text = "Shyju", Value = "1"},
new SelectListItem {Text = "Sean", Value = "2"}
};
return View(new MyViewModel());
}
và trong quan điểm
<select asp-for="EmployeeId" asp-items="@ViewBag.Employees">
<option>Please select one</option>
</select>
Sử dụng ViewBag để chuyển danh sách các mục và cài đặt tùy chọn đã chọn
Nó cũng giống như trên. Tất cả bạn phải làm là, đặt giá trị thuộc tính (mà bạn đang ràng buộc giá trị thả xuống) thành giá trị của tùy chọn bạn muốn được chọn.
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());
}
và trong quan điểm
<select asp-for="EmployeeId" asp-items="@ViewBag.Employees">
<option>Please select one</option>
</select>
Nhóm các mục
Phương thức trình trợ giúp thẻ chọn hỗ trợ các tùy chọn nhóm trong danh sách thả xuống. Tất cả bạn phải làm là, chỉ định Group
giá trị thuộc tính của từng SelectListItem
trong phương thức hành động của bạn.
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);
}
Không có thay đổi trong mã xem. trình trợ giúp thẻ chọn bây giờ sẽ hiển thị các tùy chọn bên trong 2 mục optgroup .