簡體   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