2013-08-06 101 views
3

在我的c#.net MVC應用程序中,我想顯示Enum類型的複選框列表。EnBox類型的CheckBoxList MVC Razor

我有一個枚舉類型

[Flags] 
public enum ModeType 
{ 
Undefined = 0, 
Read= 1, 
Edit= 2 
    } 

和我的模型是

Public TrainingModel 
    { 
     public int UserID {get;set;} 
     public ModeType Type {get;set} 
    } 

在我看來,我需要兩個複選框,一個用於讀取,而另一個用於編輯 所以我試圖

@Html.CheckBoxFor(m => m.Type== ModeType.Read) 
@Html.CheckBoxFor(m => m.Type== ModeType.Edit) 

但是,這給了我錯誤 「模板只能用於fie ld訪問,屬性訪問,單維數組索引或單參數自定義索引器表達式。「

我工作圍繞這一問題,通過增加兩個屬性,我的模型

Public TrainingModel 
    { 
     public int UserID {get;set;} 
     public ModeType Type {get;set} 
     public bool IsRead 
     { 
      get{Type.HasFlag(ModeType.Read);} 
      set{Type |=ModeType.Read;} 
     } 
     public bool IsEdit 
     { 
      get{Type.HasFlag(ModeType.Edit);} 
      set{Type |=ModeType.Edit;} 
     } 

    } 

,然後讓我看

@Html.CheckboxFor(m => m.IsRead) 
@Html.CheckboxFor(m => m.IsEdit) 

我知道,我已經接近它的方式是不正確的有應該是實現這一目標的更好方法。 有人請告訴我這個。

+0

除了缺少ViewModel,我沒有看到更好的方法。 HTML本身不會處理只有2個選項的標誌複選框:你做了什麼(分開的複選框處理服務器端)並使用管理複選框(未映射)的javascript和隱藏輸入(映射)添加所選標誌值並設置該輸入。在2個選項中,你的清潔度更高。 JavaScript的唯一好處是減少POST數據。 – Pluc

+0

@Pluc感謝您的回覆。但是那麼這意味着如果我要爲我的EnumType添加更多模式,那麼我將不得不添加屬性。 – ammu

+0

是的。我想你也可以破解迭代枚舉中每個選項的東西並生成複選框,然後從表單結果中收集響應(不綁定到你的模型),將它們添加並將結果保存到模型中。它不會很乾淨,但它會隨着你的枚舉變化而擴展。但是,誠實地說,如果您計劃添加枚舉選項,您可能想要選擇它們顯示的順序(查看),以及何時觸摸視圖,在視圖模型中更改它並不是很困難 – Pluc

回答

5

這是我如何解決這個問題,以將枚舉轉換爲選擇列表。 Enum.cshtml(一個編輯模板,具有UI提示指向它):

@model Enum 
@Html.DropDownListFor(model => model, Model.ToSelectList(), "Select") 

然後在視圖中使用的擴展方法:

/// <summary> 
    /// Gets a select list from an enum. 
    /// </summary> 
    /// <param name="enumObject">The enum object.</param> 
    /// <returns></returns> 
    public static SelectList ToSelectList(this Enum enumObject) 
    { 
     List<KeyValuePair<string, string>> selectListItemList = null; 
     SelectList selectList = null; 

     try 
     { 
      // Cast the enum values to strings then linq them into a key value pair we can use for the select list. 
      selectListItemList = Enum.GetNames(enumObject.GetType()).Cast<string>().Select(item => { return new KeyValuePair<string, string>(item, item.PascalCaseToReadableString()); }).ToList(); 

      // Remove default value of Enum. This is handled in the editor template with the optionLabel argument. 
      selectListItemList.Remove(new KeyValuePair<string, string>("None", "None")); 

      // Build the select list from it. 
      selectList = new SelectList(selectListItemList, "key", "value", enumObject); 

     } 
     catch (Exception exception) 
     { 
      Functions.LogError(exception); 
     } 

     return selectList; 
    } 

重構該溶液成核取方塊解釋,您可以簡單地從函數傳回Key Value Pairs,並在編輯器模板中遍歷它們。

我希望這有些幫助。