需要一个快速的解决方案来为每个枚举创建单独的CheckBoxFor

时间:2013-08-26 17:06:43

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我这样做是为了在我的视图中使用CheckBoxFor显示“列表”:

@Html.LabelFor(m => m.MyEnum, T("Pick Your Poison"))
<div>                
    @for(int i = 0; i < Model.Alcohol.Count; i++)
    {
        <label>
            @T(Model.Alcohol[i].Text)
            @Html.CheckBoxFor(m => Model.Alcohol[i].Selected)
            @Html.HiddenFor(m => Model.Alcohol[i].Value)
        </label>
    }
</div>

这是我使用的enum(仅为了清晰起见):

public enum MyEnum
{
    Beer = 1,
    Vodka = 2,
    Rum = 3
}

这很有效。问题是我很难让@T动态地翻译每个单独的项目。所以,我需要继续解决这个问题(这个问题不容易解决 - 而不是这个问题的重点)。

我想要做的是单独输出每个项目,因此我可以将自己的文本应用于每个复选框项目(因此对每个项目执行@T("")) - 这将起作用。

问题是我在CheckBoxFor的视图中找不到有关语法的任何现成信息。

我想在我看来做这样的事情:

@Html.LabelFor(m => m.MyEnum, T("Pick Your Poison"))
<div>
    <label>
    @T("Beer") <!--This will work-->
    @Html.CheckBoxFor(m => Model.Alcohol.Beer) <!--Is this even right?-->
    @Html.HiddenFor(m => Model.Alcohol.Beer) <!--Is this even right?-->
    </label>
    <label>
    @T("Vodka")
    @Html.CheckBoxFor(m => Model.Alcohol.Vodka)
    @Html.HiddenFor(m => Model.Alcohol.Vodka)
    </label>
    <label>
    @T("Rum")
    @Html.CheckBoxFor(m => Model.Alcohol.Rum)
    @Html.HiddenFor(m => Model.Alcohol.Rum)
    </label>
    }
</div>

这样做可能吗?在CheckBoxFor中单独列出项目的正确语法是什么(我看到的所有样本只使用@for循环)。我只是想继续尝试用@T作为翻译字符串的方法的第一种方式。

感谢。

2 个答案:

答案 0 :(得分:2)

根据您的描述,我认为自定义编辑器模板可能是您正在寻找的解决方案。编辑器模板几乎就像使用EditorFor帮助程序时为特定类型生成的部分视图。要创建自定义编辑器模板,请在 View \ Shared 文件夹下创建一个目录(如果该目录尚不存在),并将其命名为 EditorTemplates 。在此文件夹中,创建一个以其将绑定的Type命名的局部视图,例如 Boolean.cshtml DateTime.cshtml

下面是您的枚举模板的示例( MyEnum.cshtml ):

@model MyEnum
@Html.LabelFor(m => m, T("Pick Your Poison"))
<div>
    <label>
        @T("Beer")
        @Html.CheckBoxFor(m => MyEnum.Beer == Model)
        @Html.HiddenFor(m => MyEnum.Beer)
    </label>
    <label>
        @T("Vodka")
        @Html.CheckBoxFor(m => MyEnum.Vodka == Model)
        @Html.HiddenFor(m => MyEnum.Vodka)
    </label>
    <label>
        @T("Rum")
        @Html.CheckBoxFor(m => MyEnum.Rum == Model)
        @Html.HiddenFor(m => MyEnum.Rum)
    </label>
</div>

要使用编辑器模板,请在视图属性EditorFor上调用MyEnum。例如:

public class MyViewModel
{
    public MyEnum PropX { get; set; }
}

然后,在视图中:

@model MyViewModel
@Html.EditorFor(m => m.PropX)

根据您期望检索的内容,这可能是您想要的,也可能不是您想要的,但它可能是您正在寻找的正确方向的可能解决方案或步骤。

答案 1 :(得分:0)

为我工作的最终结果如下:

@Html.LabelFor(m => m.MyEnum, T("Pick Your Poison"))
<div>                
    @for(int i = 0; i < Model.Alcohol.Count; i++)
    {
     <label>
        @T("Beer")
        @Html.CheckBoxFor(m => Model.Days[0].Selected)
        @Html.HiddenFor(m => Model.Days[0].Value)
    </label>
    <label>
        @T("Vodka")
        @Html.CheckBoxFor(m => Model.Days[1].Selected)
        @Html.HiddenFor(m => Model.Days[1].Value)
    </label>
    <label>
        @T("Rum")
        @Html.CheckBoxFor(m => Model.Days[2].Selected)
        @Html.HiddenFor(m => Model.Days[2].Value)
    </label>
    }
</div>