Mengikat DropDownList dari Database
Saya sedang membangun tampilan yang akan menampilkan data tabular berdasarkan pilihan dari dua daftar dropdown, yang pertama memilih departemen yang diisi dari database. Yang kedua adalah dropdownlist statis untuk "Year" yang belum saya miliki. Ada jawaban untuk pertanyaan serupa, tetapi saya telah melihatnya dan mencoba segalanya. Saya sampai pada titik di mana saya mendapatkan pengecualian nol dalam tampilan tempat saya membuat markup untuk daftar tarik-turun.
Melihat:
Departemen akan kembali sebagai nol. Saya baru mengenal MVC dan menyatukannya dari contoh online . Saya menduga model saya salah.
@model IEnumerable<BudgetDemo.Models.BudgetsActualsViewModel>
@foreach (var item in Model)
{
@Html.DropDownListFor(m => item.Departments,
new SelectList(item.Departments.Select(x => x.Text)))
}
ViewModel:
public class BudgetsActualsViewModel
{
[Display(Name = "Cost Center/Department")]
[Required(ErrorMessage = "Cost Center/Department is required.")]
[StringLength(62)]
public string SelectedDepartment { get; set; }
public IEnumerable<SelectListItem> Departments { get; set; }
}
Pengontrol:
public ActionResult GetBudgetsActuals()
{
repo = new BudgetDemoRepository();
ModelState.Clear();
return View(repo.GetBudgetsActuals());
}
Kelas Repositori:
public List<BudgetsActualsViewModel> GetBudgetsActuals()
{
...
List<BudgetsActualsViewModel> budgetsActualsList = new List<BudgetsActualsViewModel>();
// Query returning correct data from DB here
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
budgetsActualsList.Add(
new BudgetsActualsViewModel
{
SelectedDepartment = ds.Tables[0].Rows[i]["Department"].ToString()
}
);
}
return budgetsActualsList;
}
Jawaban
Jadi, Anda menyimpan nilai dalam SelectedDepartmentproperti dan mengakses Departmentsdaftar. Yang tidak pernah diinisialisasi jadi jelas akan null.
Ubah GetBudgetsActualsmetode Anda seperti ini:
public BudgetsActualsViewModel GetBudgetsActuals()
{
...
BudgetsActualsViewModel budgetsActuals = new BudgetsActualsViewModel(){ Departments = new List<SelectListItem>() };
// Query returning correct data from DB here
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
budgetsActuals.Departments
.Add(new SelectListItem
{
Text = ds.Tables[0].Rows[i]["Department"].ToString(),
Value = ds.Tables[0].Rows[i]["YourRowId"].ToString()
});
}
return budgetsActuals;
}
Dan seperti inilah tampilan Anda seharusnya:
@model BudgetDemo.Models.BudgetsActualsViewModel
@Html.DropDownListFor(m => m.SelectedDepartment, Model.Departments))
Perhatikan, kami menyingkirkan foreachloop. Kami membutuhkan DropDownListFor()metode untuk dipanggil hanya sekali.
MEMPERBARUI
public class BudgetsActualsViewModel
{
[Display(Name = "Cost Center/Department")]
[Required(ErrorMessage = "Cost Center/Department is required.")]
[StringLength(62)]
public string SelectedDepartment { get; set; }
public List<SelectListItem> Departments { get; set; } // Modify it to list instead IEnumerable.
}