2011-06-12 16 views
1

代碼,我有下面的代碼是在MVC視圖模型我怎麼能重複使用,我已經創建的用於保存選擇列表項

public class adminQViewModel 
    { 

     public SubTopic SubTopic { get; set; } 
     public Answer Answer { get; set; } 

     public string Status { get; set; } 

     [DisplayName("Status")] 
     public IEnumerable<SelectListItem> StatusType 
     { 
      get 
      { 
       return new[] 
        { 
         new SelectListItem { Value = "0", Text = "Release" }, 
         new SelectListItem { Value = "1", Text = "Beta" }, 
         new SelectListItem { Value = "2", Text = "Alpha" }, 
         new SelectListItem { Value = "3", Text = "Draft" }, 
        }; 
      } 
     } 
    } 

我使用的價值和文字相同的組合在其他地方時,我檢索值並顯示相應的文本。有什麼方法可以封裝這個值的組合:texzt並在其他地方使用它,並將其用於我的選擇下拉列表?

一個例子是當我返回視圖中呈現的數據時。數據包含狀態代碼的值,例如0,1,2和3.但是我想顯示文本值。我可以創建另一個查找或硬編碼,但是我會複製數據存儲在兩個不同位置的方式。

回答

1

我建議你使用SelectLists和視圖中的輔助方法,@Html.DropDownListFor(m => m.Status, new StatusSelectList())

public class StatusSelectList : SelectList 
{ 
    private static Dictionary<int, string> data = new Dictionary<int, string> 
     { 
      { 0, "Release" }, 
      { 1, "Beta" }, 
      { 2, "Alpha" }, 
      { 3, "Draft" } 
     }; 

    public StatusSelectList() 
     : base(data, "Key", "Value") 
    { 
    } 
} 

更新:

顯示標籤當前狀態值:

  1. 裝飾你屬性與UIHint屬性視圖模型:[UIHint("DropDownList")]
  2. 將選擇列表設置爲ViewBag.SelectLists = new Dictionary<string, SelectList> { "Status", new StatusSelectList() };
  3. 使用@Html.DisplayFor(m => m.Status)顯示當前狀態值的標籤。
+0

這很好,但在視圖中,我只想讓文本出現而不給用戶下拉。特定的視圖只包含一個報告並且是隻讀的。當我迭代超過100行的數據時,那將意味着100個下拉列表:-( – 2011-06-12 18:25:46

+0

我更新瞭解決方案以顯示當前狀態值的標籤。 – Peter 2011-06-12 18:36:21

0

您可以在私有屬性中將其設置一次,然後在每個後續請求中將其返回。這就是所謂的lazy loading

private IEnumerable<SelectListItem> _statusType; 

    [DisplayName("Status")] 
    public IEnumerable<SelectListItem> StatusType 
    { 
     get 
     { 
      if (_statusType == null) 
      { 
       _statusType = new[] { 
        new SelectListItem { Value = "0", Text = "Release" }, 
        new SelectListItem { Value = "1", Text = "Beta" }, 
        new SelectListItem { Value = "2", Text = "Alpha" }, 
        new SelectListItem { Value = "3", Text = "Draft" }, 
       }; 
      } 

      return _statusType; 
     } 
    } 

另外,如果你打算重用不同用戶會話之間的相同的列表,那麼它可能是有意義的,使其靜態屬性,因此它被實例化一次,住上,直到應用程序池被回收/重新啓動。

UPDATE

可以使用LINQ的一點點找回你想要的文字。例如,基於價值2得到「阿爾法」:

string text = StatusType.SingleOrDefault(s => s.Value == "2"); 
+0

我想我真正想要的是某種程度上能夠在代碼的其他地區使用此。例如,對於var a = 2且我想打印出「Beta」或var a = 2字符並打印出「Alpha」的情況。鑑於上述情況,我該如何做這種查找? – 2011-06-12 18:13:58

+0

Ahh .. lemme更新... – Kon 2011-06-12 18:16:11

+0

MVC中的SelectListItem類需要Value爲字符串 – 2011-06-12 18:21:11

0

編寫自定義類:

public class StatusType : IEnumerable<KeyValuePair<int, string>> 
{ 
     private readonly List<KeyValuePair<int, string>> entries = new List<KeyValuePair<int, string>>(); 

    public void Add(int key, string value) 
    { 
     this.entries.Add(new KeyValuePair<int, string>(key, value)); 
    } 

    public string this[int key] 
    { 
     get 
     { 
      foreach (var kvp in this.entries) 
      { 
       if (string.Compare(kvp.Key, key, StringComparison.Ordinal) == 0) 
       { 
        return kvp.Value; 
       } 
      } 

      return null; 
     } 
    } 
} 
相關問題