2012-11-29 31 views
2

問題:MVC3 checkboxfor枚舉而不模型枚舉爲

我想顯示根據枚舉複選框列表: 例如ITEM1 [] ITEM2 []項目3 []

然而這些複選框需要基於一個逗號分隔列表model.platforms

的內容例如被檢查: 如果model.platforms = 「1,3,5」,則頁面上的輸出應該是:

物品1 [X] ITEM2 []項目3 [X] ITEM4 [] ITEM5 [X]

我迄今所做的: 到目前爲止,我已經嘗試創建一個自定義的助手,它接受枚舉類型和我的「model.platforms。目標是在逗號分割平臺,然後在迭代枚舉時,如果枚舉的value位於列表中,請選中該複選框。

我是否正在接近這個權利?我知道我的MVC/C#的方式,但這些幫助者對我來說確實是新手。任何指導,指向我在正確的方向,將不勝感激

我曾試圖查找SO的各種解決方案,但其中大部分圍繞枚舉是模型的一部分,這對我來說是不實際的,由於這樣的模型,來生成(我真的不希望添加視圖模型此特定情形)

代碼到目前爲止

--helper.cs--

public static MvcHtmlString PlatformList<enumType>(this HtmlHelper htmlHelper, string platformList) 
{ 
    List<string> selectedPlatforms = platformList.Split('/').ToList(); //This will come from model.platforms ("platform1/platform2/etc") 
    TagBuilder tg = new TagBuilder("div"); 
    string innerhtml = ""; 
    foreach (var item in Enum.GetValues(typeof(enumType))) 
    { 

    innerhtml = innerhtml + "{build up here}"; 

    } 
    tg.SetInnerText(innerhtml); 
    return new MvcHtmlString(innerhtml); 
} 

--Enum。 cs--

public enum en_GamePlatforms 
{ 
    [Display(Name = "PC")] 
    PC =1, 
    [Display(Name = "DOS")] 
    DOS = 2, 
    ...{etc}... 
    } 

--View--

@(Html.Raw(Html.PlatformList<MagpieEnumerations.en_GamePlatforms>(Model.Platform).ToString())) 

下面是我原來的做法,我實在不喜歡,但提供的頁面上的正確的輸出。(但不它關閉枚舉名稱而不是值:())

@{ 
       List<string> platformsActive = Model.Platform.Split(',').ToList(); 

      } 
      @foreach (myenums.en_GamePlatforms item in Enum.GetValues(typeof(myenums.en_GamePlatforms))) 
      { 
       <span> 
        @Html.Label("SelectedPlatform" + item, Enum.GetName(typeof(myenums.en_GamePlatforms), item)) 
        @{bool t = platformsActive.Contains(item.ToString(Model));} 
        <input name="Selectedtypes" id="Selectedtypes" type="checkbox" @(t ? "checked='checked'" : "") value="@item"/> | 
       </span> 
      } 

回答

1

您可以通過使用以下代碼來實現它。

public static IHtmlString CheckboxListForEnum<T>(this HtmlHelper html, string name, T modelItems) where T : struct 
{ 
    StringBuilder sb = new StringBuilder(); 

    foreach (T item in Enum.GetValues(typeof(T)).Cast<T>()) 
    { 
     TagBuilder builder = new TagBuilder("input"); 
     long targetValue = Convert.ToInt64(item); 
     long flagValue = Convert.ToInt64(modelItems); 

     if ((targetValue & flagValue) == targetValue) 
      builder.MergeAttribute("checked", "checked"); 

     builder.MergeAttribute("type", "checkbox"); 
     builder.MergeAttribute("value", item.ToString()); 
     builder.MergeAttribute("name", name); 
     builder.InnerHtml = item.ToString(); 

     sb.Append(builder.ToString(TagRenderMode.Normal)); 
    } 

    return new HtmlString(sb.ToString()); 
} 

請參考這個網址checkboxlist in asp.net MVC

+0

這是非常有用的,我就以此爲模板,但不得不取出功能部分,因爲這類型將始終使用一定的枚舉。 +1! – JustAnotherDeveloper