2013-05-31 80 views
1

我在填充MVC3中的下拉列表時遇到了一些問題。我希望有人能夠幫助我。在MVC3中填充DropDownList?

我想呈現一個包含城市DropDownList的用戶視圖。這應該從數據庫中提取。實際上,User類具有City類的ForeignKey。

下面是控制器和視圖:

public ViewResult Index() 
{ 
    //return View(model); 
    var DefaultCities = new[] 
    { 
     new {Name = "London"} 
    }.ToList(); 

    IEnumerable<SelectListItem> cities = unitOfWork.CityRepository.Get() as IEnumerable<SelectListItem>; 
    ViewData["AllCities"] = cities != null ? new SelectList(cities.AsEnumerable(), "CityID", "Name") : new SelectList(DefaultCities.AsEnumerable(), "Name"); 

    return View(unitOfWork.UserRepository.Get(orderBy: us => us.OrderByDescending(u => u.ID)).OfType<User>().ToList()); 
} 

//觀

<div class="editor-field"> 
    @Html.DropDownList(**"CityID"**, ViewData["AllCities"] as SelectList, "--Choose One--")) 
    @Html.ValidationMessageFor(model => model.CityID) 
</div> 

但顯示以下錯誤:

有型的無ViewData的項目「 IEnumerable'具有關鍵'CityID'。

這是我第一次參加MVC! 'CityID'是指什麼?我應該寫什麼作爲@Html.DropDownList的第一個參數?

正如我已閱讀不同的文章,提到的論點應該是表單字段的名稱。

任何人都可以提示示例代碼? 任何幫助,將不勝感激。

回答

5

下面的代碼行是錯誤的:

new SelectList(cities.AsEnumerable(), "CityID", "Name") 

您指定CityIDName屬性,但citiesIEnumerable<SelectListItem>。而SelectListItem只有ValueText屬性。沒有這樣的東西,如CityIDName

所以你可能是指:

ViewData["AllCities"] = cities != null 
    ? new SelectList(cities, "Value", "Text") 
    : new SelectList(DefaultCities, "Name"); 

或者乾脆:

ViewData["AllCities"] = cities != null 
    ? cities 
    : new SelectList(DefaultCities, "Name"); 

,並在您的視圖:

@Html.DropDownList( 
    "CityID", 
    ViewData["AllCities"] as IEnumerable<SelectListItem>, 
    "--Choose One--" 
) 

至於視圖中的CityID參數而言,這將基本上由DropDownList助手使用來生成name您的DOM中select元素的屬性,並因此將選定的值名稱傳遞給您將表單提交給控制器操作。

順便使用ViewData/ViewBag是非常不好的做法。我建議你使用一個視圖模型,並在你的視圖中有一個強類型的DropDownListFor幫助器,它將綁定到視圖模型上的一個特定屬性。

+0

請您提上查看正確的代碼? – Ali

+0

如果您在控制器中使用我的第一個代碼片段,您可以保持視圖中的代碼與您目前的代碼相同。如果你使用我的第二個代碼片段,你需要更新你的視圖中的DropDownList幫助器調用,如我的答案中所示,以便使用「IEnumerable 」。 –

+0

我想知道錯誤是如何出現的。我完全按照你所說的完成了。 – Ali

1

林好奇你的城市庫的輸出如何強制轉換爲IEnumerable<SelectListItem> 不過,假設它的城市對象的枚舉,你可以試試下面的

在你的控制器

ViewBag.Cities = new SelectList(unitOfWork.CityRepository.Get(), "CityID", "Name"); 

在你看來

<div class="editor-field"> 
     @Html.DropDownList("CityID", (SelectList)ViewBag.Cities) 
</div> 
+0

我測試了你的建議,但錯誤仍然存​​在! :( – Ali

1

那麼,看看你的代碼,如果城市是空的,那麼它會去你的默認城市。但是,您只在默認的SelectList中列出了名稱而不是CityID。

您可能還想嘗試首先綁定默認集合以確保它能夠正常工作。然後嘗試其他...只是一些調試技巧,以縮小範圍。

這裏有您需要什麼:

var cities = unitOfWork.CityRepository.Get(); 

    ViewData["AllCities"] = cities != null ? new SelectList(cities, "CityID", "Name") : new SelectList(DefaultCities.AsEnumerable(), "CityID", "Name"); 

你的看法是:

@Html.DropDownList("Cities",(SelectList)ViewData["AllCities"]) 

另外,我剛纔看到你在哪裏定義DefaultCities。它也沒有CityID。 此:

var DefaultCities = new[] 
    { 
     new {Name = "London"} 
    }.ToList(); 

應該是這樣:

var DefaultCities = new[] 
    { 
     new {Name = "London", CityID=1} 
    }.ToList(); 
+0

感謝我的朋友,但不幸的是它沒有工作:(我猜這個問題是其他的東西,實際上,User類是從Man類派生的,而CityID是後者的屬性,所以你認爲它可能是原因是什麼? – Ali

+0

你的City類是否有CityID和Name的屬性?查看案例。我正在看一個現在遵循相同的模式,工作正常。這將有所幫助。 –

+0

我對延遲表示歉意,只是時間差異的問題。實際上,城市課程確實涉及屬性,CityID和名稱。情景是這樣的;我有主頁,然後點擊用戶面板,所以我進入面板,但當我點擊創建新用戶鏈接時,出現錯誤! 「沒有類型爲」IEnumerable「的ViewData項目具有」CityID「鍵。」 – Ali