下拉列表用于根据数据库中的值选择值

本文关键字:选择 数据库 用于 下拉列表 | 更新日期: 2023-09-27 17:57:49

大家好。我有下一个问题。

我有编辑表单,上面有几个下拉列表控件。我需要根据数据库中的数据在 DropDownList 中绑定选定的值。

我接下来是:

型:

供应商

public class Supplier{
    public int SupplierID { get; set; }       
    public string CompanyName { get; set; }
}

德尔维里

public class Delivery{
    public int DeliveryID { get; set; }
    public string DeliveryCode { get; set; }
    public int SupplierID { get; set; }
    public virtual Supplier Supplier { get; set; }        
}

视图模型交付编辑屏幕:

public class DeliveryEditViewModel{
    public int DeliveryID { get; set; }        
    public string SelectedCompanyName { get; set; }
    public IEnumerable<SelectListItem> Suppliers { get; set; }
}

视图:

<dd>
    @Html.DropDownListFor(x => x.SelectedCompanyName, new SelectList(Model.Suppliers, "Value", "Text"), htmlAttributes: new { @class = "form-control" })
</dd>

控制器:

 // GET: Deliveries/Edit
public ActionResult Edit(int? id){   
    db.Configuration.ProxyCreationEnabled = false;
        DeliveryEditViewModel model = db.Deliveries.Include(s => s.Supplier).Include(a => a.Auction).Include(q => q.Quality).Include(t => t.BulbType)
                .Where(d => d.DeliveryID == id)
                .Select(x => new DeliveryEditViewModel{
                    DeliveryID = x.DeliveryID,
                    SelectedCompanyName = x.Supplier.CompanyName
                })
                .Single();               
    model.Suppliers = db.Suppliers.Where(s => s.IsActive == true).Select(x => new SelectListItem{
        Value = x.SupplierID.ToString(),
        Text = x.CompanyName
    });
    return View(model);
}

问题是我无法根据数据库中已有的数据在 DropDownList 中设置选定的值。相反,我有一个始终处于活动状态的第一个元素的下拉列表控件。我已经尝试了从 Html.DropdownList 中解决未设置的选定值,但我仍然选择了第一个值而不是实际值。

几个小时的研究和已经大胆的头发让我停下来寻求帮助。请帮助我弄清楚这怎么可能。

非常感谢。

下拉列表用于根据数据库中的值选择值

Suppliers已经IEnumerable<SelectListItem> 为什么在视图中使用new SelectList(Model.Suppliers, "Value", "Text")创建另一个相同的视图?您需要通过@StephenMuecke设置SelectedCompanyName的值以匹配其中一个选项(即供应商表中SupplierID的值之一(但您的代码建议应int属性而不是string

我建议您不要在控制器级别创建选择列表项。你能做的是:

public class DeliveryEditViewModel
{
    public int DeliveryID { get; set; }        
    public string SelectedCompanyName { get; set; }
    public IEnumerable<Supplier> suppliers { get; set; }
}

控制器:

 // GET: Deliveries/Edit
public ActionResult Edit(int? id){   
    db.Configuration.ProxyCreationEnabled = false;
        DeliveryEditViewModel model = db.Deliveries.Include(s => s.Supplier).Include(a => a.Auction).Include(q => q.Quality).Include(t => t.BulbType)
                .Where(d => d.DeliveryID == id)
                .Select(x => new DeliveryEditViewModel{
                    DeliveryID = x.DeliveryID,
                    SelectedCompanyName = x.Supplier.CompanyName
                })
                .Single();               
    Model.suppliers = db.Suppliers.Where(s => s.IsActive == true);
    return View(model);
}

视图:

  @Html.DropDownListFor(model => model.SelectedCompanyName, ((IEnumerable<Supplier>)Model.supplierss).Select(x => new SelectListItem()
           {
               Text = x.CompanyName.ToString(),
               Value = x.SupplierID.ToString(),
               Selected = (Model != null) && (x.CompanyName == Model.SelectedCompanyName)
           }), "-- Select Supplier --")

这是一个非常有用的技巧,您可以更改文本或值或选定值或默认选定选项,而无需在控制器上更改并再次构建它以反映。