2012-08-29 90 views
0

我在asp.net中有一個下拉列表,在視圖中使用嵌套for循環,以及從控制器傳遞的變量 。顯示給用戶的值應該是停止的名稱,該值是該停止的ID。名稱和站點ID都在我從控制器傳遞給視圖的列表中。但是,當顯示下拉列表時,將爲整個列表重複第一個停止名稱。我知道正在選擇正確的停止標識,但名稱正在重複。這裏是我的代碼:爲什麼這個下拉列表做它應該做的?

<select id="stop" onchange="sendInfo();"> 

@foreach(var blah in ViewBag.foobar) 
{ 
    foreach (var foo in ViewBag.stops) 
    { 
     <option value="@foo">@blah</option> 
    } 
} 
</select> 

foo是正確使用的停止標識,但是blah是停止名稱的名稱,重複該名稱。我覺得我很親密,但不是那樣。我希望這已經夠清楚了,解釋起來很混亂。

+0

你的代碼是做什麼它應該。你想改變什麼? – SLaks

+0

blah不斷重複它自己 - 它不斷重複ViewBag.foobar中無用列表中的第一個元素。

回答

0

我還不能肯定我明白你說什麼,但如果有一個1:停止和IDS 1的關係,你爲什麼不使含有一類,像

public class Stop 
{ 
    public string Name { get; set; } 
    public int Id { get; set; } 
} 

,並通過在人的名單,做一個循環:

@{ 
    var stops = (IEnumerable<Stop>)ViewBag.Stops; 
} 

<select> 
    foreach (var stop in stops) 
    { 
     <option value="@stop.Id">@stop.Name</option> 
    } 
</select> 
+0

謝謝,我終於得到這個工作的基礎上你的想法使用一個類的數組。這也有助於簡化我的代碼,並促使我更好的名字。 –

2

試試這個:

 @{ 
      if(ViewBag.foo != null && ViewBag.blah != null && ViewBag.foo.Count == ViewBag.blah.Count) 
      { 
       for (int i = 0; i < ViewBag.foo.Count; i++) 
       { 
        <option value="@ViewBag.foo[i]">@ViewBag.blah[i]</option> 
       } 
      } 
     } 

此外,一些提示:

  1. 使用兩個列出了相關的數據是不恰當的。爲什麼你沒有一個單一的財產,如Dictionary<string, string>
  2. fooblah不是他們的真名,對吧?
  3. 避免使用ViewBag來獲取與功能相關的數據(如創建控件,就像您正在做的那樣)。對於這種情況,建立一個專門的視圖模型優先
+1

很確定應該是Count,Length是用於字符串,但是foo會是List或類似的。我同意。看起來像原始代碼選擇一個停止名稱,然後輸出所有停止號碼,或反之亦然。索引應該配對。理想情況下,我會創建一個包含字符串和數字表示的類/結構,這樣您就不會因爲排序順序不同而產生一些奇怪的現象,或者在另一個列表之前被添加到另一個列表中。 – Mike

+0

@Mike我同意它可以更好地設計。但是,我通常不會給出諸如「您應該更改代碼」的答案,我更願意關注所描述的問題。 –

+0

我試過了你的建議,但是我得到了「對空引用無法執行運行時綁定」的行(...)。 –

相關問題