CheckBoxList для типов Enum MVC Razor
В моем приложении MVC C#.net я хотел бы отобразить список флажков для типов Enum.
У меня тип enum
[Flags]
public enum ModeType
{
Undefined = 0,
Read= 1,
Edit= 2
}
и моя модель
Public TrainingModel
{
public int UserID {get;set;}
public ModeType Type {get;set}
}
На мой взгляд, мне нужно два флажка, один для чтения, а другой для редактирования, поэтому я попытался
@Html.CheckBoxFor(m => m.Type== ModeType.Read)
@Html.CheckBoxFor(m => m.Type== ModeType.Edit)
Но это дает мне ошибку: "Шаблоны могут использоваться только с доступом к полям, доступом к свойствам, индексом одномерного массива или выражениями настраиваемого индексатора с одним параметром".
Я обошел эту проблему, добавив в мою модель еще два свойства
Public TrainingModel
{
public int UserID {get;set;}
public ModeType Type {get;set}
public bool IsRead
{
get{Type.HasFlag(ModeType.Read);}
set{Type |=ModeType.Read;}
}
public bool IsEdit
{
get{Type.HasFlag(ModeType.Edit);}
set{Type |=ModeType.Edit;}
}
}
а затем сделать мой взгляд
@Html.CheckboxFor(m => m.IsRead)
@Html.CheckboxFor(m => m.IsEdit)
Я знаю, что то, как я подошел, неверно, и должен быть лучший способ добиться этого. Может кто-нибудь, пожалуйста, посоветуйте мне это.
1 ответ
Вот как я решил эту проблему, чтобы преобразовать Enums в списки выбора. Enum.cshtml (шаблон редактора с подсказкой пользовательского интерфейса, указывающей на него):
@model Enum
@Html.DropDownListFor(model => model, Model.ToSelectList(), "Select")
Затем метод Extension используется в представлении:
/// <summary>
/// Gets a select list from an enum.
/// </summary>
/// <param name="enumObject">The enum object.</param>
/// <returns></returns>
public static SelectList ToSelectList(this Enum enumObject)
{
List<KeyValuePair<string, string>> selectListItemList = null;
SelectList selectList = null;
try
{
// Cast the enum values to strings then linq them into a key value pair we can use for the select list.
selectListItemList = Enum.GetNames(enumObject.GetType()).Cast<string>().Select(item => { return new KeyValuePair<string, string>(item, item.PascalCaseToReadableString()); }).ToList();
// Remove default value of Enum. This is handled in the editor template with the optionLabel argument.
selectListItemList.Remove(new KeyValuePair<string, string>("None", "None"));
// Build the select list from it.
selectList = new SelectList(selectListItemList, "key", "value", enumObject);
}
catch (Exception exception)
{
Functions.LogError(exception);
}
return selectList;
}
Чтобы преобразовать это решение в списки флажков, вы можете просто вернуть пары значений ключей из функции и просмотреть их в шаблоне редактора.
Я надеюсь, что это поможет.