来自枚举的单选按钮组

时间:2014-04-03 10:48:07

标签: c# asp.net-mvc enums

我试图以可能的值呈现为单选按钮组的方式为枚举类型提供通用视图模型和编辑器模板。让我详细说明一下。

VM看起来像这样

public class OptionViewModel<TEnum> where TEnum : struct, IConvertible
{
   public TEnum SelectedValue { get; set; }
}

然后,我可以通过编写

为项目中的任何枚举创建一个实例
public enum Numbers { One, Two, Three }

...
NumberOptions = new OptionViewModel<Numbers>();
...

然后通过

呈现
@model OptionViewModel<TEnum>

@foreach (var value in Enum.GetValues(typeof(TEnum)).Cast<TEnum>())
{
   var selected = value == Model.SelectedValue;

   @Html.RadioButton(value.ToString(), value, selected)
}

不幸的是,模板甚至无法编译,因为当然没有类型&#39; TEnum&#39;

有更好的(工作)方式吗?我真的得到了这种抽象级别,因为枚举中的单选按钮组在我的项目中是一个相当常见的情况,并且附带了其他属性,例如IsVisible,IsEnabled等。

1 个答案:

答案 0 :(得分:1)

我会将视图模型中的枚举值存储为字符串,并创建一个接受通用参数的函数来创建视图模型。

public class OptionViewModel
{
   public string SelectedValue { get; set; }
   public List<string> Values { get; set; }

   public static OptionViewModel Create<TEnum>() where TEnum : struct, IConvertible
   {
        var ovm = new OptionViewModel();
        foreach (var value in Enum.GetValues(typeof(TEnum)).Cast<TEnum>())
        {
             ovm.Values.Add(value);
        }
        return ovm;
   }
}

在控制器中:

NumberOptions = OptionViewModel.create<Numbers>();

在视图中,如果我没弄错,mvc表单将返回Model.SelectedValue中的值:

@model OptionViewModel

@foreach (var value in model.Values)
{
   var selected = value == Model.SelectedValue;

   @Html.RadioButton(Model.SelectedValue, value, selected)
}