2011-06-15 76 views
1

我被要求查看一些ASP.Net MVC代碼中的錯誤,並對SelectList有一個(對我來說)非常奇怪的問題。ASP.Net MVC SelectList不是'選擇'正確的項目

控制器生成項目的代碼(返回SelectList的方法,共有5個)。然後將每個SelectList保存到ViewData集合中。

List<SelectListItem> items = new List<SelectListItem>(); 
string yesText = "Yes"; 
string noText = "No"; 
if (ci.LCID.Equals((int)LanguageCodes.FRANCE)) 
{ 
    yesText = "Oui"; 
    noText = "Non"; 
} 

SelectListItem yesItem = new SelectListItem(); 
yesItem.Text = yesText; 
yesItem.Value = ((int)MarketingBy.Yes).ToString(); 
yesItem.Selected = selectedValue != null && selectedValue.Equals(int.Parse(yesItem.Value)); 

SelectListItem noItem = new SelectListItem(); 
noItem.Text = noText; 
noItem.Value = ((int)MarketingBy.No).ToString(); 
noItem.Selected = selectedValue != null && selectedValue.Equals(int.Parse(noItem.Value)); 

items.Add(yesItem); 
items.Add(noItem); 

return new SelectList(items, "Value", "Text", yesItem.Selected ? yesItem.Value : noItem.Value); 

快速「快速監視」在創建點表明一切正常: Select List generated http://i52.tinypic.com/x3hd3r.png

在視圖所呈現的點,值還是看行。但是,當視圖加載時,列表中的第一項是總是選擇。生成的HTML爲:

<tr> 
<td>Fax</td> 
<td> 
    <select id="MarketingByFax" name="MarketingByFax"> 
     <option value="134300002">Yes</option> 
     <option value="134300001">No</option> 
    </select> 
</td> 
</tr> 

(爲了清楚起見,省略其他值)。

任何想法?或研究途徑?作者堅持認爲這是「直到上週」(我不知道任何方式)。

編輯:代碼視圖 -

<td><%: Html.DropDownList("MarketingByFax", (SelectList)ViewData["MarketingByFaxList"])%></td> 
+0

您可以添加視圖中的代碼嗎?您是使用Html.DropDownList還是Html.DropDownListFor? – FlyingDeveloper 2011-06-15 18:01:44

+0

Html。DropDownList正在被使用(現在也增加了問題) – glosrob 2011-06-15 18:44:12

回答

5

這段代碼看起來在每個可想象的方面(當然恕我直言)是可怕的。我不知道爲什麼它不起作用,我不想知道。我所能做的就是向你建議如何改進它(如果你正在尋找一個關於爲什麼你的代碼不工作的解決方案,那麼你可以停止閱讀這篇文章,因爲我沒有任何想法)。

所以第一個改進是擺脫任何ViewData和引進視圖模型:

public class MyViewModel 
{ 
    public string SelectedValue { get; set; } 
    public IEnumerable<SelectListItem> Items { get; set; } 
} 

那麼我將有一個控制器行動,將填充此視圖模型:

public ActionResult Index() 
{ 
    var model = new MyViewModel 
    { 
     // I want to preselect the second value 
     SelectedValue = "No", 
     Items = new[] 
     { 
      new SelectListItem { Value = "Yes", Text = "yeap !" }, 
      new SelectListItem { Value = "No", Text = "nope !" }, 
     } 
    }; 
    return View(model); 
} 

並且在我強烈的類型視圖中,我會簡單地將幫助者綁定到視圖模型:

<%= Html.DropDownListFor(
    x => x.SelectedValue, 
    new SelectList(Model.Items, "Value", "Text") 
) %> 

另外,如果你想使用一些枚舉類型,你可能會發現following extension method有用。

看看它是多麼容易?沒有更多的醜陋蒙上與ViewData,不再需要定義任何列表,並指定一些複雜的情況下,...

備註:再一次,這些都只是我的2¢,你可以,如果你願意繼續戰鬥與ViewData

+0

對於最近的答覆道歉..我同意你上面提到的大部分 - 特別是ViewModel/ViewData部分。 Twas本來不是我的代碼,可悲的是 - 我無法承受我的項目需要完全重寫它的時間(有關頁面上面有更多內容)...所以這在技術上是正確的回答,但不是在這個特定情況下使用的。 – glosrob 2011-06-17 18:47:03

+0

@Darin你的答案很神奇。他們總是出現,就像我將要提出一個類似的問題,與我的問題略有關聯。它修復了我的問題 – Eon 2016-12-12 17:55:33

0

你可以嘗試

<%: Html.DropDownList("MarketingByFax", (IEnumerable<SelectListItem>)ViewData["MarketingByFaxList"])%> 

dropdwon具有接受選擇列表的類型對象的枚舉過載,它會自動設置取決於列表的價值列表中的selectListItems的選定屬性。爲此,你必須設置

ViewData["MarketingByFaxList"] = items;//where item is IEnumerable<SelectListItem> or List<SelectListItem> as you used in your code 
相關問題