데이터베이스에서 DropDownList 바인딩

Nov 24 2020

두 개의 드롭 다운 목록에서 선택한 항목을 기반으로 테이블 형식 데이터를 표시하는보기를 작성 중입니다. 첫 번째 항목은 부서를 선택하는 항목이 데이터베이스에서 채워집니다. 두 번째는 "Year"에 대한 정적 드롭 다운 목록이며 아직 가져 오지 않았습니다. 비슷한 질문에 대한 답변이 있지만 나는 그들을보고 모든 것을 시도했습니다. 드롭 다운 목록에 대한 마크 업을 만든 뷰에서 null 예외가 발생하는 지점에 도달했습니다.

전망:

부서가 null로 돌아옵니다. 나는 MVC를 처음 접했고 온라인 예제 에서 이것을 모았습니다 . 내 모델이 틀렸다고 생각합니다.

@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; }
}

제어 장치:

public ActionResult GetBudgetsActuals()   
{
    repo = new BudgetDemoRepository();
    ModelState.Clear();
    return View(repo.GetBudgetsActuals());
}

리포지토리 클래스 :

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;
}

답변

1 JamshaidK. Nov 24 2020 at 06:13

따라서 SelectedDepartment속성에 값을 저장 하고 Departments목록에 액세스합니다 . 초기화되지 않으므로 분명히 null.

다음 GetBudgetsActuals과 같이 방법을 수정하십시오 .

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;
}

그리고 이것은 당신의 뷰가 어떻게 보일 것입니다 :

@model BudgetDemo.Models.BudgetsActualsViewModel
@Html.DropDownListFor(m => m.SelectedDepartment, Model.Departments))

foreach루프를 제거했습니다 . DropDownListFor()한 번만 호출되는 메서드가 필요합니다 .


최신 정보

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.
}