【问题标题】:Binding DropDownList from Database从数据库绑定 DropDownList
【发布时间】:2021-03-06 17:16:09
【问题描述】:

我正在构建一个视图,它将根据两个下拉列表中的选择显示表格数据,第一个选择部门是从数据库中填充的。第二个是“年”的静态下拉列表,我还没有。有类似问题的答案,但我已经看过它们并尝试了所有方法。我已经到了在为下拉列表创建标记的视图中出现空异常的地步。

查看:

Departments 返回为 null。我是 MVC 的新手,并从在线 examples 拼凑起来。我猜我的模型是错误的。

@model IEnumerable<BudgetDemo.Models.BudgetsActualsViewModel>

@foreach (var item in Model)
{
    @Html.DropDownListFor(m => item.Departments, 
        new SelectList(item.Departments.Select(x => x.Text)))
}

视图模型:

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

【问题讨论】:

  • 您是否尝试过复制另一个列表中的值,而不是传递该方法返回的列表?
  • @JamshaidKamran,不,因为老实说,我不明白为什么我的下拉菜单有两个属性(我从链接的示例中复制了它)并且在我尝试时得到了一个 IEnumerable 强制转换异常。
  • 好的,很清楚。您将值保存在 SelectedDepartment 中,并访问显然为空的另一个属性。
  • 您的 BudgetsActualsViewModel 类将 Departments 定义为类型 IEnumerable&lt;SelectListItem&gt;,而您的存储库返回类型 List&lt;BudgetsActualsViewModel&gt; 用于方法 GetBudgetsActuals()
  • @JamshaidKamran,同意。但我需要一个代码示例作为答案。谢谢。

标签: c# asp.net asp.net-mvc model-view-controller asp.net-mvc-5


【解决方案1】:

因此,您将保存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.
}

【讨论】:

  • 'IEnumerable' 不包含接受“IEnumerable”类型的第一个参数的“添加”的定义
  • 请更改您的模型以使用列表而不是IEnumerable。查看更新。
  • 对于“YourRowId”,我插入了“SelectedDepartment”并出现错误:System.ArgumentException: 列 'SelectedDepartment' 不属于表 Table
  • @IrishChieftain,这就是你必须喂它的东西。您的数据库有一个 ID 列,大多数情况下它是主键。提供该列
  • 您可能想要修改模型以在其中包含其他数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
  • 2013-08-30
  • 1970-01-01
  • 1970-01-01
  • 2010-09-26
相关资源
最近更新 更多