簡體   English   中英

枚舉中的單選按鈕組

[英]Radio button group from enum

我試圖針對枚舉類型提出一種通用的視圖模型和編輯器模板,以便將可能的值呈現到單選按鈕組中。 讓我詳細說明。

虛擬機看起來像這樣

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等。

我將枚舉值作為字符串存儲在視圖模型中,並創建一個接受通用參數的函數來創建視圖模型。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM