Привязка Enum к LINQ и SelectListItem - PullRequest
4 голосов
/ 16 февраля 2009

Я пытаюсь связать следующее перечисление

public enum CertificateTypes : byte
{
    None = 0,
    Original = 1,
    AuthenticatedCopy = 2,
    Numbered = 3
}

до tinyint столбца в базе данных. Однако при создании SelectListItems и вызове, например, Person.CertificateTypes.Original.ToString() I get this:</p> <pre><code><option value="Original">Original</option>

который не привязывается к байту? колонка. Как мне это сделать? Должен ли я явно установить значение «1» в свойстве Value SelectListItem ? Или есть способ сделать эту работу "автоматически"?

Ответы [ 3 ]

15 голосов
/ 16 февраля 2009

Если вы хотите автоматически, вы можете использовать

var enumValues = Enum.GetValues(typeof(CertificateTypes)).Cast<CertificateTypes>().Select(e => (byte)e);
var selectList = new SelectList(enumValues);

Проблема здесь в том, что вы собираетесь получать только байты, поэтому вам, вероятно, потребуется выбрать новый тип, например ...

var enumValues = Enum.GetValues(typeof(CertificateTypes)).Cast<CertificateTypes>()
                                                         .Select(e => new KeyValuePair<byte, string>((byte)e, e.ToString()));
var selectList = new SelectList(enumValues, "Key", "Value");

Это просто взяло бы возможные значения из перечисления и преобразовало бы его в IEnumerable CertificateTypes, а затем приняло бы каждое значение и преобразовало его в новый KeyValuePair.

Стоит отметить, что, как правило, рекомендуется делать множественные числа перечисленными, только если на них есть атрибут [Flags]. В противном случае я бы назвал это единственное число.

Должен любить LINQ!

1 голос
/ 16 февраля 2009

Не уверен, как следующее переводит SelectListItems в ASP.NET/MVC, хотя, поскольку у меня нет опыта, но, возможно, это может быть полезно.


Конечно, вы должны специально привести перечисление к его базовому типу, такому как (byte)Person.CertificateTypes.Original, чтобы он хорошо взаимодействовал с базой данных.

В WinForms я использую IList из KeyValuePair<byte,string> для привязки к ComboBox, используя что-то вроде следующего:

foreach (Enum value in Enum.GetValues(typeof(CertificateTypes))
    MyBindingIList.Add(new KeyValuePair<byte,string>((byte)value, value.ToString()));

Затем я связываю ComboBox и устанавливаю DisplayMember на "Value" и ValueMember на "Key". (Вы можете переключить Key и Value в KeyValuePair на то, что имеет для вас смысл. Для меня ключ выходит из базы данных, поэтому имеет смысл быть числовым типом.)

0 голосов
/ 16 февраля 2009

Я действительно сомневаюсь, что вызов ToString() для перечисления возвращает xml ... Вы можете уточнить, что происходит ? Возможно, вы захотите либо привести перечисление к байту / int (и работать с числами большую часть времени), либо использовать Enum.Parse в какой-то момент - но трудно сказать, не понимая, как вы его подцепили ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...