2012-06-29 4 views
1

Я получил EnumASP.NET DropDownList перечисление проверка

public enum TypeDesc 
{ 
[Description("Please Specify")] 
PleaseSpecify, 
Auckland, 
Wellington, 
[Description("Palmerston North")] 
PalmerstonNorth, 
Christchurch 
} 

Я Binding это перечисление, чтобы выпадающий список, используя следующий код на Page_Load

protected void Page_Load(object sender, EventArgs e) 
     { 
      if (TypeDropDownList.Items.Count == 0) 
      { 
       foreach (TypeDesc newPatient in EnumToDropDown.EnumToList<TypeDesc>()) 
       { 
       TypeDropDownList.Items.Add(EnumToDropDown.GetEnumDescription(newPatient)); 
       } 
      } 
     } 

public static string GetEnumDescription(Enum value) 
     { 
      FieldInfo fi = value.GetType().GetField(value.ToString()); 

      DescriptionAttribute[] attributes = 
       (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false); 

      if (attributes != null && attributes.Length > 0) 
       return attributes[0].Description; 
      else 
       return value.ToString(); 
     } 

     public static IEnumerable<T> EnumToList<T>() 
     { 
      Type enumType = typeof(T); 

      // Can't use generic type constraints on value types, 
      // so have to do check like this 
      if (enumType.BaseType != typeof(Enum)) 
       throw new ArgumentException("T must be of type System.Enum"); 

      Array enumValArray = Enum.GetValues(enumType); 
      List<T> enumValList = new List<T>(enumValArray.Length); 

      foreach (int val in enumValArray) 
      { 
       enumValList.Add((T)Enum.Parse(enumType, val.ToString())); 
      } 

      return enumValList; 
     } 

и моя страница ASPX использовать следующие код для подтверждения

  <asp:DropDownList ID="TypeDropDownList" runat="server" > 
      </asp:DropDownList> 
      <asp:RequiredFieldValidator ID="TypeRequiredValidator" runat="server" ControlToValidate="TypeDropDownList" ErrorMessage="Please Select a City" Text="<img src='Styles/images/Exclamation.gif' />" 
       ValidationGroup="city"></asp:RequiredFieldValidator> 

Но моя аттестация принимает «Укажите» в качестве названия города Я хочу, чтобы пользователь не отправлял, если город не выбран.

ответ

2

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

TypeDropDownList.Items.Add("Please Specify",""); 
foreach (TypeDesc newPatient in EnumToDropDown.EnumToList<TypeDesc>()) 
{ 
    TypeDropDownList.Items.Add(EnumToDropDown.GetEnumDescription(newPatient), newPatient.ToString()); 
} 

Удалить «Пожалуйста, укажите» из перечисления

+0

Но я спасаю мой enum значение as tinyint в моей базе данных. Если я удалю «Please Specify» из enum, он сохранит 0 для Auckland в моей базе данных, и я не хочу, чтобы – KillerGearz

+0

хорошо, вы можете начать перечисление с 1 'Auckland = 1' – tsukimi

+0

Я сделал, что он работает таким образом для всех значений кроме «Пальмерстон-Норт». визуальная студия с помощью ошибки Jscript для валидатора, приведенной ниже: Ошибка выполнения Microsoft JScript: Sys.WebForms.PageRequestManagerServerErrorException: «TypeDropDownList» имеет значение SelectedValue, которое недействительно, поскольку оно не существует в списке элементов. Имя параметра: значение – KillerGearz

0

DropDownList можно связать со свойством Value и Text, когда явно указано. Когда значение для элемента равно null, это будет подтверждено вашим валидатором.

<asp:DropDownList ID="TypeDropDownList" runat="server" DataTextField="Text" DataValueField="Value" ></asp:DropDownList> 

и при добавлении элементов:

foreach (TypeDesc newPatient in EnumToDropDown.EnumToList<TypeDesc>()) 
{ 
    string text = EnumToDropDown.GetEnumDescription(newPatient)), 
    TypeDropDownList.Items.Add(new 
    { 
     Text = text, 
     Value = text == "Please specify" ? null : text // should be replaced with a clean solution 
    } 
} 
+0

Что было бы более чистым решением? – tsukimi

+0

не работал с ошибкой Jscript: ошибка времени выполнения Microsoft JScript: Sys.WebForms.PageRequestManagerServerErrorException: «TypeDropDownList» имеет значение SelectedValue, которое недействительно, потому что оно не существует в списке элементов. Имя параметра: значение – KillerGearz

+0

@tsukimi - Присвойте атрибут, такой как System.ComponentModel.DataAnnotations.KeyAttribute, и когда он установлен, используйте это значение как значение – Polity

0

Я отсортирован его я использовал следующий код

if (TypeDropDownList.Items.Count == 0) 
      { 
       foreach (TypeDesc newPatient in EnumToDropDown.EnumToList<TypeDesc>()) 
       { 
        string text = EnumToDropDown.GetEnumDescription(newPatient); 

        TypeDropDownList.Items.Add(new ListItem(text, newPatient.ToString())); 
       } 
      } 

и валидатор как

<asp:RequiredFieldValidator ID="TypeRequiredValidator" runat="server" ControlToValidate="TypeDropDownList" 
       InitialValue="PleaseSpecify" ErrorMessage="Please Select a City" Text="<img src='Styles/images/Exclamation.gif' />" 
       ValidationGroup="city"></asp:RequiredFieldValidator>