2014-02-06 101 views
1

我已經瀏覽了很多帖子和幾個例子,用於在MVC和Razor中創建下拉列表的方式,而不是像解決我的問題。MVC下拉列表將不會顯示存儲的值

基本上我有這行代碼創建我的下拉

@Html.DropDownListFor(model => model.MarketSegmentID, 
           new SelectList(""), 
           new { @class = "dropdownList"}) 

然後與jQuery我填寫下拉與值從控制器

然後我後我的形式,並在所選擇的值下拉菜單正確顯示。

我遇到的問題是當我打開表單備份時,我無法從模型中獲取我保存的值以顯示選定的值。

爲了好玩,我添加了這行代碼,它顯示了我保存的值。

@Html.EditorFor(model => model.MarketSegmentID) 

任何想法我做錯了什麼?

+0

問:爲什麼你填充在jQuer中選擇列表而不是通過控制器中匹配的'ViewBag.MarketSegmentId'? –

+0

...或使用ViewModel? –

+0

@AndréFigueiredo:他有一個ViewModel,你的意思是擴展它嗎? DropDownLists不需要,因爲它們已經連接到ViewBag中查看(請參閱下面的答案)。 –

回答

0

除非你有一個真正的需要來填充選擇列表的客戶端,你最好把你的價值觀的SelectList直入控制器和使用ViewBag.MarketSegmentId屬性:

@Html.DropDownListFor(model => model.MarketSegmentID) 

甚至只是

@Html.DropDownList("MarketSegmentID") 

在控制器中,您將有這樣的事情(發生變化,以適應自己的數據):

ViewBag.MarketSegmentID = new SelectList(someDataList, "ValueProperty", "NameProperty"); 

someDataList可以是任何集合(例如,數據庫表,列表等)。 「ValueProperty」是數據中包含要存儲的值的屬性名稱(通常是一個int值)。 「NameProperty」是數據中包含要在每個項目上顯示的文本的屬性名稱。如果SelectList構造它將只使用元素沒有指定屬性名

List<int> ints = new List<int>(); 
for (int i = 0; i < 100; i++) 
{ 
    ints.Add(i); 
} 
ViewBag.MarketSegmentID = new SelectList(ints); 

假設你想要的整數的簡單列表,按順序產生,你可以在一個循環中這樣將它們添加在顯示和值的集合中。

MVC將自動在與模型屬性同名的ViewBag屬性中查找SelectList。例如Model.MarketSegmentID被認爲是所選擇的價值和ViewBag.MarketSegmentID假定持有匹配SelectList

這也將填充從在顯示頁面視圖模型當前的選擇,並從選擇更新你的回報視圖模型值名單。

如果您描述數據的類型,我可以更新它以顯示在控制器中填充SelectList的具體示例。

+0

數據類型是int – user3036753

+0

@ user3036753:你的意思是一個簡單的整數值列表,如0-100等? –

+0

它的ID是,所以它可以是1-10000,數據如下所示:粘合劑-1,B&C-2,塗料-3等 – user3036753

0

這是我如何使用做:

剃刀:

@Html.DropDownListFor(m => m.MarketSegmentID , Model.GetMarketSegmentList, new { @class = "form-control" }) 

視圖模型:

public int? MarketSegmentID { get; set; } 
public List<SelectListItem> GetMarketSegmentList { get; set; } 

控制器:

var vm = new ViewModelWhatever(); 
[..] 
vm.GetMarketSegmentList = GetMarketSegmentList() 
          .ToList() 
          .Select(x => new SelectListItem() 
          { 
           Value = x.MarketSegmentID.ToString(), 
           Text = x.Name 
          }) 
          .ToList(); 
+0

我不是說你不能這樣做,我只是說MVC提供了一個更簡單的方法,內置,通過使用與Selectlist屬性相同的名稱的ViewBag條目。然後,您可以繼續使用數據模型,而不是引入額外的ViewModel來添加SelectList。 –