如何在没有 ViewBag 的情况下将 MVC 中的下拉列表与查找值一起使用 ASP.NET

本文关键字:查找 一起 NET ASP 下拉列表 MVC ViewBag 情况下 | 更新日期: 2023-09-27 17:55:53

这应该很容易,尽管至少在谷歌上搜索了一个小时,但我一生都无法意识到我还没有找到任何答案。无论如何,我们来了:

我想创建一个简单的 ASP.NET MVC 视图,其中包含一些下拉列表,允许用户选择一些值,然后将其作为 ID:s 保存到数据库中。正如我被告知ViewBag/ViewData是魔鬼的工作一样,我试图通过向我的(View)模型添加一个选择列表来解决这个问题,例如:

public virtual SelectList Accommodations { get; set; }

然后在我的控制器中用类似的东西填充它:

LoanApplication theLoanApplication = new LoanApplication();
            theLoanApplication.Accommodations = new SelectList(db.Accommodations.ToList(), "AccommodationID", "Name");

最后,在我看来,使用它来使其正常工作:

@Html.DropDownListFor(model => model.AccommodationID, Model.Accommodations, "Choose Accommodation")

这应该工作,但是当我尝试保存模型时,我收到错误,指出 Accommodation(列表)为 null,这是预期的。不过,我的模型中的其他一切都是应该的。

我查看了 ASP.NET 网站上著名的"Countoso University"代码示例,其中他们似乎使用 ViewBag 来解决类似的问题。是不是为了让 ViewBag 在这样的场景中使用起来并不那么糟糕,它甚至可能是最好的解决方案?如果没有,解决这个问题而不使用ViewBag/ViewData的首选方法是什么?

谢谢。

如何在没有 ViewBag 的情况下将 MVC 中的下拉列表与查找值一起使用 ASP.NET

在控制器发布操作中,只需像在 get 操作中那样从数据库重新加载Accommodations列表即可。

如果modelstate有错误并且您希望将这些错误传递回视图,则通常会执行此操作,否则无需重新加载选择列表。 您尚未指定它提供空引用的确切位置,因此我假设当您遇到 modelstate 错误并重新加载视图以显示服务器端错误时。 例如:

[HttpPost]
public ActionResult EditAccommodation(AccommodationViewModel model)
{
    if (!ModelState.IsValid) 
    {
        model.Accommodations = new SelectList(db.Accommodations.ToList(), "AccommodationID", "Name");
        return View(model);
    }
    // else modelstate ok and model.AccommodationID set 
    ...
}

顺便说一句,我建议您保持变量名称清晰,例如:

public virtual SelectList AccommodationSelectList { get; set; }

然后,当您参考Accommodations时,很清楚它是选择列表(这不是真正的住宿列表,而是选择项目的列表)还是数据库中真正的住宿列表。