2010-12-20 60 views
0

我知道這已被問幾次,但現有的解決方案看起來像黑客而不是一個適當的模式。Html.DropDownList中可能存在的錯誤,選擇的值不反映?

我有一個簡單的下拉列表。我正試圖用數據填充它,並選擇了一個項目。我在'填充數據部分'方面取得成功,但未能事先選擇我的首選項目。

我正在使用ASP.NET MVC 3 RC2。

重要的代碼位:

{ 
    // Bunch of code 
    CategoryOptions = new SelectList(categories, "Id", "Slug", article.Category.Id); 
} 

現在...的CategoryOptions被傳遞到HTML輔助,像這樣:

@Html.DropDownListFor(a => a.Category, Model.CategoryOptions) 

我已經看過了值傳遞到幫助並且已確認其中一個項目的選定值已設置爲true:

alt text

但是,它並不反映在幫助程序生成的Html中。沒有任何...標籤具有selected =「selected」屬性。

我使用反射來檢查代碼了一下,這條線(SelectExtensions.SelectInternal)看起來冒險:

item.Selected = (item.Value != null) ? set.Contains(item.Value) : set.Contains(item.Text); 

難道我做錯了什麼嗎?或者是框架(ASP.NET MVC 3 RC2)在這裏出錯。

回答

1

好吧......我只是修復它。

我改變了我的視圖模型使用CategoryId而不是類別slug。所以,現在,我的看法是這樣的:

@Html.DropDownListFor(a => a.CategoryId, Model.CategoryOptions, new { @class = "ask-category-field" }) 

我認爲模型值被選擇(在這種情況下,A => a.CategoryId)必須具有相同類型選擇「值」。 (當我有更多的時間去了解框架代碼時,我會對這個解釋進行細化)。但是巧妙的編碼的確是:) ASP.NET MVC開發者的帽子。

現在,它可以像預期的那樣完美地工作,並且在整個PRG生命週期中保留對所選項目的更改。

希望這可以幫助別人。

0

下拉項目上的選定屬性實際上並未設置要在HTML中選擇的下拉項目。

我以前經歷過這個問題。

我對這個解決方案是在ViewDataDictionary的擴展方法,它允許您根據所選項目的&選擇列表中的字符串ID指定選擇列表的值。

public static void SetSelectedValueFor(this ViewDataDictionary viewDataDictionary, string key, IEnumerable<SelectListItem> items) 
     { 
      // HACK: Store the selected item value in ViewData so that the DropDownListFor knows which one should be selected. 
      // It's a bit of a hack but it seems to be the only way I can do it since DropdownListFor ignores the Selected property on SelectListItem. 
      var x = items.Where(c => c.Selected).FirstOrDefault(); 
      if (x != null) 
      { 
       viewDataDictionary[key] = x.Value; 
      } 
     } 
+0

感謝您的回答......我也發佈了問題發佈後我發現的答案。希望這也能幫助你。 – kidoman 2010-12-20 11:12:43