问题:
我想显示基于枚举的复选框列表:例如第1[]项第2[]项第3[]项
但是,这些复选框需要根据逗号分隔列表model.platforms
的内容进行检查
例如:如果model.platforms
="1,3,5",则页面上的输出应为:
第1[x]项第2[]3项第4[]5项第5[x]
到目前为止我所做的:到现在为止,我已经尝试创建一个自定义助手,它接受枚举类型和我的"model.platforms"。目的是在逗号处拆分平台,然后在遍历枚举时,如果列表中有枚举的value
,请选中复选框。
我是不是正在接近这个问题 我熟悉MVC/C#,但这些助手对我来说真的是新手。将不胜感激为我指明正确方向的任何指导
我试着在S.O上查找各种解决方案,但大多数都围绕着作为模型一部分的枚举展开,由于模型的生成方式,这对我来说并不实用(我真的不想为这个特定场景添加视图模型)
到目前为止的代码
--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);
}
--枚举.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>
}
您可以使用以下代码来实现它。
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());
}
请参阅asp.net MVC 中的此url复选框列表