0

MVC 中的下拉列表...基本上是我存在的祸根...

我已经看到很多关于这个确切问题的主题,但是我在这里和互联网上找到的所有内容都没有解决我的问题。

先介绍一下背景:我有一个允许用户编辑记录的页面。编辑页面上的这些字段之一是一个包含客户的下拉列表。要进入编辑页面,用户单击另一个页面上的编辑链接,该页面上有一个记录表。当他们到达编辑页面时,表单会填充来自所选记录的信息以进行编辑。除了登录屏幕之外,它可能是任何移动数据的网站最基本和最常见的功能之一。

所以,这是视图中的代码:

@Html.DropDownList("ClientsDropdown", (IEnumerable<SelectListItem>)ViewBag.ClientsDropdown, "Select a Client")

这是控制器中的代码:

[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(invoice) 调用:

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")

我希望这可以帮助某人……将来的任何人。

4

1 回答 1

1

以不使用 ViewBag 或 ViewData 的方式重构您的代码。这听起来很傻,但它会起作用,你会有更好的代码。

你必须做的:

  • 创建一个 ViewModel 类,它可以派生自 Invoice 类
  • 添加加属性:pageNumber 和 SelectList
  • 在视图中使用 DropDownListFor 助手
于 2013-06-12T17:31:59.903 回答