c# - 来自枚举的单选按钮组

标签 c# asp.net-mvc enums

我正在尝试以一种将可能的值呈现到单选按钮组中的方式为枚举类型提出通用 View 模型和编辑器模板。让我详细说明。

虚拟机看起来像这样

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)
}

不幸的是,模板甚至无法编译,因为当然没有类型“TEnum”。

是否有更好的(有效的)方法来做到这一点?我真的得到了这种抽象级别,因为枚举中的单选按钮组在我的项目中是相当常见的情况,并且它带有其他属性,例如 IsVisible、IsEnabled 等。

最佳答案

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

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;
   }
}

在 Controller 中:

NumberOptions = OptionViewModel.create<Numbers>();

在 View 中,如果我没记错的话,mvc 表单将返回 Model.SelectedValue 中的值:

@model OptionViewModel

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

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

关于c# - 来自枚举的单选按钮组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22835244/

相关文章:

c# - Swashbuckle - 在 swagger 文档中将字符串视为枚举

c# - Expression.Lambda 有逆运算吗?

c# - Visual Studio 2010 WPF 设计器规模

c# - 为 .NET 属性目标指定所需的基类

asp.net-mvc - Asp.Net MVC 2 下拉显示 System.Web.MVC.SelectListItem

asp.net - ASP.NET MVC 注定要取代 Webforms 吗?

c# - MVC 3,防止人们通过 URL 在服务器上浏览

c - 处理枚举按位大小大于 64

java - 实现响应式方向枚举的最简单方法? java

c# - 获取系统上安装的所有 Access ACE.OLEDB 驱动程序的列表