mvc3复选框枚举没有枚举在模型中

时间:2012-11-29 14:12:48

标签: c# asp.net-mvc-3 html-helper

问题:

我想根据枚举显示一个复选框列表:   例如item1 [] item2 [] item3 []

但是,需要根据逗号分隔列表model.platforms的内容检查这些复选框

例如:   如果model.platforms =“1,3,5”,则页面上的输出应为:

item1 [x] item2 [] item3 [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}...
  }

- 视图 -

   @(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 个答案:

答案 0 :(得分: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