1

如何爲多個DropDownListFor保存數據?我有這個代碼,但選定的項目沒有到達控制器。保存DropDownListFor多個選定的值

我的代碼視圖:

@Html.DropDownListFor(model => model.Ingredients, new SelectList(Model.ListIngredients, "Id", "Description"), "Select the ingredients", new { multiple = "multiple", }) 

我的模型:

public ICollection<Ingredient> Ingredients { get; set; } 
public ICollection<Ingredient> ListIngredients{ get; set; } 

Ingredient.cs:

public string Description { get; set; } 
public int Id { get; set; } 

我必須改變我的助手的名稱和ID用於保存數據?

+0

這可能有助於http://stackoverflow.com/a/8434800/1126404 –

+0

@NikolaMitev與ListBoxFor它仍然不工作,我和一個ListBoxFor不可能添加一個選項標籤 – Ninita

回答

0

您正嘗試將選定的值綁定到成分集合中。 不過,如果你看看張貼的價值觀,他們將是這個樣子:

......配料= 1種&成分= 2 ...

這意味着模型綁定不知道如何將1,2(它們是成分ID)等值轉換爲成分類的實例。


你需要改變,你將獲得由用戶選擇的成分您的視圖模型的財產,所以不是成分的集合:

public ICollection<Ingredient> Ingredients { get; set; } 

你有ID的集合(這是屬性您正在使用的多選的值),例如:

public int[] SelectedIngredients { get; set; } 

(我已經把其更名爲但這並不是必需的,我做它只是對C )

作爲一個建議,我會從該多選(「選擇成分」選項)中刪除默認選項值,並使用標籤或工具提示。否則,它可能看起來像列表中的任何其他值,您將不得不處理用戶選擇該選項的情況,這不是有效的成分。

更好的是,我還會使用@Model.ListBoxFor幫手,因爲這樣可以讓大家知道他們正在處理多選。否則(使用下拉幫助器),除非您查看屬性,否則您可能沒有意識到它是多選。例如:

@Html.ListBoxFor(m=>m.SelectedIngredients, new SelectList(Model.ListIngredients, "Id", "Description")) 

當然,這些只是建議。如果不符合您的要求,您可以高興地忽略它們!

作爲最終評論,可以將發佈的值轉換爲Ingredient對象,就像您最初在視圖模型中使用的那樣。這將要求您編寫您自己的模型綁定器並將其配置爲「成分」類型。但是,您只會在發佈的值中收到id,因此您必須檢索其他屬性(可能來自數據庫),否則您將收集只有Id被填充的Ingredient對象的集合。除非你真的需要,否則我不會走這條路。

+0

我的老闆不我希望爲此使用viewModel,並且它是負責模型的其他團隊,他們需要有一個成分集合(帶有Id和說明)。我知道只通過更改名稱和(我想)幫助者的ID就可以做我想做的事情。例如,我知道這個名字必須是'Name =「Ingredients []」'。但我嘗試過每一個名字和ID(例如:'Name =「Ingredients [] .Id」,id =「Ingredients [] _Id」')並沒有什麼 – Ninita

+0

我不認爲你可以這樣做,除非你擁有簡單的類型如int或string。原因是select具有單個名稱屬性,因此所有選定的值將始終以該名稱發佈。對於你想要的(複雜對象的集合),你需要發佈名稱,比如'Ingredients [0] .Id','Ingredients [1] .Id'。請參閱[此鏈接](http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx)和[此鏈接](http://haacked.com/archive/2008/10/23/model-binding-to- a-list.aspx /)獲取有關與集合綁定的模型的更多信息。 –

+0

@Ninita,除此之外,你仍然可以選擇創建你的自定義模型綁定器 –