डेटाबेस से DropDownList बाइंडिंग

Nov 24 2020

मैं एक ऐसा दृश्य बना रहा हूं जो दो ड्रॉपडाउनिस्टों के चयन के आधार पर सारणीबद्ध डेटा प्रदर्शित करेगा, जो पहले विभागों का चयन करता है वह डेटाबेस से पॉपुलेटेड होता है। दूसरा "वर्ष" के लिए एक स्थैतिक ड्रॉपडेलिस्ट है जो मुझे अभी तक नहीं मिला है। इसी तरह के सवालों के जवाब हैं, लेकिन मैंने उनकी तरफ देखा और सब कुछ आजमाया। मैं उस बिंदु पर पहुंच गया हूं जहां मुझे उस दृश्य में एक अशक्त अपवाद मिल रहा है जहां मैंने ड्रॉपडाउनलिस्ट के लिए मार्कअप बनाया था।

राय:

विभाग अशक्त के रूप में वापस आ रहे हैं। मैं एमवीसी के लिए नया हूं और इसे ऑनलाइन उदाहरणों से जोड़ा गया है । मैं अनुमान लगा रहा हूं कि मेरा मॉडल गलत है।

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