首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

ASP.NET MVC DropDownListFor 報錯:ViewData 缺少 IEnumerable 鍵值

     編輯:程式設計綜合問答

錯誤信息

There is no ViewData item of type 'IEnumerable<SelectListItem>' 
that has the key 'AppCurrentLanguage'.

根因分析

@Html.DropDownListFor(m => m.AppCurrentLanguage, Model.LanguageList, ...) 要求:

  1. Model.LanguageList 必須是 IEnumerable<SelectListItem> 且**非 null**。
  2. Model.AppCurrentLanguage 必須有值(用於預選),否則下拉框無默認選中項。

控制器 GetLanguage() 中:

var model = new HomeIndexView {
    LanguageList = this.RetrieveLanguagesList()
};
return View(model);  // AppCurrentLanguage 未賦值!

導致 Model.AppCurrentLanguage == null,MVC 嘗試在 ViewData 中尋找同名鍵值失敗拋錯。

修正控制器代碼

public ActionResult GetLanguage() {
    var model = new HomeIndexView {
        LanguageList = RetrieveLanguagesList(),
        AppCurrentLanguage = "zh-CN"  // 設置默認語言代碼,或從 Cookie/Session 讀取
    };
    return View(model);
}

public List<SelectListItem> RetrieveLanguagesList() {
    var list = new List<SelectListItem>();
    var langs = uow.AppLanguage.GetAll().ToList();
    if (langs != null) {
        foreach (var lang in langs) {
            list.Add(new SelectListItem {
                Text = lang.LanguageName,
                Value = lang.LanguageCode
            });
        }
    }
    return list;  // 確保不返回 null
}

視圖防禦性寫法

@{
    var langList = Model.LanguageList ?? new List<SelectListItem>();
    var currentLang = Model.AppCurrentLanguage ?? "zh-CN";
}
@Html.DropDownListFor(m => m.AppCurrentLanguage, langList, 
    new { id = "appLanguage", name = "appLanguage", tabindex = "0" })

關鍵檢查清單

  • RetrieveLanguagesList() 返回 List<SelectListItem> 且非 null。
  • Model 實例化時**同時賦值** LanguageList 和 AppCurrentLanguage。
  • 視圖中對 Model 屬性做 null 合併運算符防護。

總結

MVC DropDownListFor 報缺少 ViewData 鍵,實為 **Model 屬性未初始化**(AppCurrentLanguage 為 null)導致框架嘗試回退 ViewData 失敗。控制器構建 Model 時**完整賦值所有屬性**,視圖加防禦性判斷,即可解決。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved