MVC中的下拉列表......基本上是我存在的祸根......
我在这个问题上看过很多话题,但我在这里和互联网上找到的所有内容都没有解决我的问题。
有点背景知识: 我有一个页面,允许用户编辑记录。编辑页面上的其中一个字段是一个填充了客户端的下拉列表。要进入编辑页面,用户单击另一个页面上的编辑链接,其中包含记录表。当他们到达编辑页面时,表单将填充所选记录中的信息进行编辑。除了登录屏幕,它可能是任何移动数据的网站最基本和最常见的功能之一。
所以,这是View中的代码:
@Html.DropDownList("ClientsDropdown", (IEnumerable<SelectListItem>)ViewBag.ClientsDropdown, "Select a Client")
这是Controller中的代码:
[HttpGet]
public ViewResult Details(int id, int pageNumber = 1)
{
Invoice invoice = db.Invoices.Find(id);
FillClientDropdown(invoice);
var model = new InvoiceDetailsModel() { Invoice = invoice, PageNumber = pageNumber };
return View(model);
}
并且FillClientDropdown(发票)调用:
private void FillClientDropdown(Invoice invoice)
{
var clientList = db
.Clients
.OrderBy(x => x.Name)
.ToList()
.Select(x => new SelectListItem
{
Selected = (x.ID == invoice.ClientOcrStringID),
Text = x.Name,
Value = x.ID.ToString()
});
ViewBag.ClientsDropdown = new SelectList(clientList, "Value", "Text", "Selected");
}
我已经确认clientList确实从数据库中获取了一个很好的客户端列表,并且正确的SelectListItem将“Selected”属性设置为True。
但是当我加载页面并检查下拉列表时,这就是我得到的:
<select id="ClientsDropdown" name="ClientsDropdown">
<option value="">Select a Client</option>
<option value="1">Test Client 1</option>
<option value="2">Test Client 2</option>
我猜想创建一个新的SelectList也会为每个选项添加一个Selected =“something”值,但似乎并非如此。
如果我能够使用Web表单,那么知道如果我能在大约3分钟内完成此操作,那么对此问题的任何帮助都会非常感激...
更新
看起来我搞定了!
这是我做的: 我已经有一个InvoiceDetailsModel可以使用,所以我补充说:
public SelectList ClientList { get; set; }
然后,在我的InvoiceController中,我稍微更改了我的详细信息:
[HttpGet]
public ViewResult Details(int id, int pageNumber = 1)
{
Invoice invoice = db.Invoices.Find(id);
var clientList = db
.Clients
.OrderBy(x => x.Name)
.ToList()
.Select(x => new SelectListItem
{
Text = x.Name,
Value = x.ID.ToString()
});
var model = new InvoiceDetailsModel() { Invoice = invoice, PageNumber = pageNumber };
model.ClientList = new SelectList(clientList, "Value", "Text", model.Invoice.ClientOcrStringID);
return View(model);
}
利用我对InvoiceDetailsModel的补充。最后,在我看来,我将Dropdown更改为:
@Html.DropDownListFor(model => model.Invoice.ClientOcrStringID, Model.ClientList, "Select a Client")
我希望这有助于某人...将来的任何人。
答案 0 :(得分:1)
将代码重构为不使用ViewBag或ViewData的方式。这听起来很傻但它会起作用,你会有更好的代码。
你需要做什么: