如何从不同数据表绑定下拉框?ASP.NET MVC技术问询
在ASP.NET MVC中为不同下拉框绑定不同数据表数据
你现在的两个下拉框都复用了同一个ViewBag.MyCustomCollection集合,要实现分别绑定不同数据表的数据,只需要在后端准备两个独立的数据源,再在前端分别引用它们即可,具体步骤如下:
1. 后端控制器准备双数据源
假设第一个下拉框需要从Ticket表获取TicketNo数据,第二个下拉框从GenerateUsers表(替换成你实际的表名)获取GenerateBy相关数据。在你的Index控制器方法里,分别查询这两个表的数据,存入不同的ViewBag属性:
public ActionResult Index() { // 从第一个数据表获取TicketNo选项数据 var ticketOptions = db.Tickets.Select(t => new { TicketNo = t.TicketNo }).ToList(); ViewBag.TicketOptions = ticketOptions; // 从第二个数据表获取GenerateBy选项数据 var generateByOptions = db.GenerateUsers.Select(u => new { UserId = u.Id, DisplayName = u.GenerateBy }).ToList(); ViewBag.GenerateByOptions = generateByOptions; // 保留你原有的GenerateTicket_Details数据逻辑 var ticketDetails = db.GenerateTicket_Details.ToList(); return View(ticketDetails); }
注意:
- 替换
db.Tickets和db.GenerateUsers为你项目中实际的DbSet名称 - 第二个下拉框如果需要区分
value值和显示文本,就像示例里的UserId和DisplayName;如果显示和存储的值一致,就把两个字段设为同一个(比如都用GenerateBy)
2. 前端视图修改下拉框绑定
调整视图里的两个下拉框,分别对应不同的ViewBag集合:
第一个下拉框(Ticket No)
@using (Html.BeginForm("AccountDetails", "Index", FormMethod.Post, new { })) { @Html.DropDownList("Value", new SelectList(ViewBag.TicketOptions as System.Collections.IEnumerable, "TicketNo", "TicketNo"), "Ticket No", new { @class = "collection", name = "Value", onchange = "jsFunction()" })
第二个下拉框(Generate By)
@Html.DropDownList("GenerateBy", new SelectList(ViewBag.GenerateByOptions as System.Collections.IEnumerable, "UserId", "DisplayName"), "Select Generate By", new { @class = "collection" })
这里的"UserId"是下拉框选项的value属性值,"DisplayName"是页面上显示的文本,你可以根据自己的表结构灵活调整这两个参数。
3. 进阶优化:用强类型ViewModel替代ViewBag
虽然ViewBag能快速实现需求,但强类型ViewModel可以避免运行时错误,代码也更易维护。你可以创建一个包含所有所需数据的ViewModel:
public class TicketPageViewModel { public IEnumerable<GenerateTicket_Details> TicketDetails { get; set; } public IEnumerable<SelectListItem> TicketOptions { get; set; } public IEnumerable<SelectListItem> GenerateByOptions { get; set; } }
然后在控制器中填充ViewModel:
public ActionResult Index() { var viewModel = new TicketPageViewModel(); viewModel.TicketDetails = db.GenerateTicket_Details.ToList(); viewModel.TicketOptions = db.Tickets.Select(t => new SelectListItem { Value = t.TicketNo.ToString(), Text = t.TicketNo.ToString() }).ToList(); viewModel.GenerateByOptions = db.GenerateUsers.Select(u => new SelectListItem { Value = u.Id.ToString(), Text = u.GenerateBy }).ToList(); return View(viewModel); }
最后修改视图的模型声明:
@model PinkPearl.Models.TicketPageViewModel
下拉框绑定改为直接引用ViewModel的属性:
@Html.DropDownList("Value", Model.TicketOptions, "Ticket No", new { @class = "collection", name = "Value", onchange = "jsFunction()" }) @Html.DropDownList("GenerateBy", Model.GenerateByOptions, "Select Generate By", new { @class = "collection" })
内容的提问来源于stack exchange,提问作者aparna rai
相关产品推荐
相关产品推荐

