繁体   English   中英

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

[英]How to use dropdownlists in ASP.NET MVC with lookup values without ViewBag?

这应该真的很容易,而且尽管至少一个小时的谷歌搜索,但我一生都无法意识到我没有找到任何答案。 无论如何,我们开始:

我想用一些下拉列表创建一个简单的ASP.NET MVC视图,允许用户选择一些值,然后将这些值另存为ID:s到数据库。 有人告诉我ViewBag / ViewData是恶魔,我试图通过向我的(View)Model中添加一个选择列表来解决此问题,例如:

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

这可以正常工作,但是当我尝试保存模型时,出现错误,即Accommodations属性(列表)为null,这是预期的。 我模型中的其他所有内容均应保留。

我已经看过ASP.NET网站上著名的“ Countoso University”代码示例,在其中似乎他们使用ViewBag解决了类似的问题。 是不是这样,ViewBag在这样的情况下使用并不是很糟糕,它甚至可能是最好的解决方案? 如果不是,那么首选方法是解决此问题而不使用ViewBag / ViewData?

谢谢。

在您的控制器后操作中,只需像在get操作中那样从数据库重新加载Accommodations列表。

如果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 ,很明显它是选择列表(实际上不是住宿列表,而是选择项列表)还是数据库中的实际住宿列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM