2012-05-03 90 views
0

在MVC3中,當使用DropDownListFor時,第一個參數是否必須是字符串?我有以下設置:MVC3 DropDownListFor未設置選定屬性

@Html.DropDownListFor(m => m.MyListItemId, Model.MyListItems, 
    new Dictionary<string, object> 
    { 
     { "style", "width:120px" }, 
     { "data-type", "myList" } 
    }) 

其中m.MyId是我的viewmodel上的int。我遇到了一個問題,當我在下拉列表中更改所選項目並檢查呈現的html時,「selected」屬性未設置爲新選擇的項目。這是一個問題,因爲我使用jQuery的克隆功能來複制該行,我需要與新的選定項目列表複製到我的新行。想法?

更新 - 將viewmodel的屬性更改爲字符串沒有區別。 這是mvc dropdownlistfor的錯誤嗎?我在相似的問題上閱讀了不少文章,但似乎無法找到適用於此實例的解決方案。這是我的名單是如何設置在我的代碼:

var myListItems = _myRepository.GetAll(); 
model.MyListItems = new SelectList(myListItems, "Id", "Name", lineItem.myListItemId); 
model.MyListItemId = lineItem.myListItemId; 

其中LINEITEM傳入該方法

+1

不知道我是否誤解了你的問題;但如果你用jQuery克隆克隆選擇列表,你需要重新選擇選項,查看問題[here](http://stackoverflow.com/questions/3776270/jquery-clone-doesnt-copy-select-dom -properties?answertab =最老)和[這裏](http://stackoverflow.com/questions/3861729/copy-clone-dropdown-list-with-selected-option-in-jquery)。 – pjumble

+0

謝謝!我沒有意識到這一點!這可能有助於克隆,我現在會嘗試。我仍然好奇,爲什麼選擇新項目時爲什麼下拉列表選擇值在呈現的html中不會改變? –

+0

這不是我真正想要的。我可以從上一行復制選定的值,但主要問題是最新的選定值沒有標記爲選中 –

回答

0

不行,選擇的價值屬性並不需要是一個字符串,它可以是一個int。只要該值可以轉換爲字符串,它應該可以工作(所選的值類型可以是Guid,int,bool等)。

當我的頁面路由具有與所選值模型屬性同名的路由參數時,我有時會發現問題。例如,考慮一下:

route: "/establishments/{establishmentId}/edit" 

型號:

public class MyViewModel 
{ 
    public int EstablishmentId { get; set; } 
    public SelectListItem[] Establishments { get; set; } 
} 

查看:

@Html.DropDownListFor(m => m.EstablishmentId, Model.Establishments) 

有了這個代碼,在下拉列表中選擇的值將始終是任何establishmentId是路線。因此,如果路線是/建立/ 12 /編輯,則在下拉菜單中選擇值12。路徑參數和模型屬性大小寫不匹配並不重要。

我想通過下載MVC源代碼,製作我自己的DropDownListFor(名爲MyDropDownListFor)副本,然後單步執行代碼來查看發生了什麼。如果你仍然遇到MVC3的麻煩,我建議你也這樣做。你需要弄清楚這是否是服務器代碼的問題,或者你的jQuery克隆的東西。

+0

這是一個好主意,我下載了mvc代碼,我在selectlist擴展類中添加了它,它依賴於像MvcResources的東西,我得到一個編譯錯誤無法訪問內部類...我怎麼得到這個狀態,所以我可以調試它? –

+0

它有一對夫婦參考,你可以用任何東西來替換它來編譯。例如,除了例外情況,我只是用自己的字符串替換資源調用。你必須複製一些內部的類和方法。但請相信我,它真的瞭解這些HTML助手如何在應用程序代碼的上下文中工作。 – danludwig

+0

謝謝!我調試了,但沒有發現任何有用的東西。當我選擇一個新的項目時,呈現的html中的選定項目仍然保留爲前一項目... –