2010-09-14 13 views
8

मेरे पास मेरे व्यू-मॉडल के गुणों में से एक के लिए एक enum है। मैं एक ड्रॉप-डाउन सूची प्रदर्शित करना चाहता हूं जिसमें enum के सभी मान शामिल हैं। मैं इसे निम्नलिखित कोड के साथ काम करने के लिए प्राप्त कर सकता हूं।मैं enum मानों के साथ एक ड्रॉपडाउन सूची कैसे बना सकता हूं?

मुझे क्या आश्चर्य है कि क्या एनम से एक आईनेमरेबल में परिवर्तित करने का एक आसान तरीका है? मैं इसे निम्नलिखित उदाहरण में मैन्युअल रूप से कर सकता हूं, लेकिन जब मैं एक नया एनम मान जोड़ता हूं तो कोड ब्रेक होता है। मुझे कल्पना है कि मैं इसे example के अनुसार प्रतिबिंब के माध्यम से कर सकता हूं, लेकिन क्या ऐसा करने के अन्य तरीके हैं? Enum.GetNames पर

public enum Currencies 
{ 
    CAD, USD, EUR 
} 

public ViewModel 
{ 
    [Required] 
    public Currencies SelectedCurrency {get; set;} 

    public SelectList Currencies 
    { 
    List<Currencies> c = new List<Currencies>(); 
    c.Add(Currencies.CAD); 
    c.Add(Currencies.USD); 
    c.Add(Currencies.EUR); 

    return new SelectList(c); 
    } 
} 

उत्तर

18

मैं एक सहायक है कि मैं here पाया एक सामान्य enum प्रकार के साथ मेरी SelectLists पॉप्युलेट करने के लिए उपयोग कर रहा हूँ, मैं जोड़ने के लिए एक छोटे संशोधन किया चयनित मान हालांकि, यह इस प्रकार की तरह लग रहा है:

public static SelectList ToSelectList<T>(this T enumeration, string selected) 
{ 
    var source = Enum.GetValues(typeof(T)); 

    var items = new Dictionary<object, string>(); 

    var displayAttributeType = typeof(DisplayAttribute); 

    foreach (var value in source) 
    { 
     FieldInfo field = value.GetType().GetField(value.ToString()); 

     DisplayAttribute attrs = (DisplayAttribute)field. 
         GetCustomAttributes(displayAttributeType, false).FirstOrDefault() 

     items.Add(value, attrs != null ? attrs.GetName() : value.ToString()); 
    } 

    return new SelectList(items, "Key", "Value", selected); 
} 

इसके बारे में अच्छी बात यह है कि यह शीर्षक के बजाय enum नाम के रूप में DisplayAttribute पढ़ता है।

तो तुम इस तरह अपने enums करने के लिए प्रदर्शन attirubete जोड़ने की आवश्यकता होगी (यदि आपके enums रिक्तियाँ या आप स्थानीयकरण की आवश्यकता तो यह आपके जीवन बहुत आसान बना देता है):

public enum User_Status 
{ 
    [Display(Name = "Waiting Activation")] 
    Pending, // User Account Is Pending. Can Login/Can't participate 

    [Display(Name = "Activated")] 
    Active,    // User Account Is Active. Can Logon 

    [Display(Name = "Disabled")] 
    Disabled,   // User Account Is Diabled. Can't Login 
} 

और यह आप कैसे उपयोग है उन्हें आपके विचारों में।

<%: Html.DropDownList("ChangeStatus" , ListExtensions.ToSelectList(Model.statusType, user.Status))%> 

Model.statusType प्रकार User_Status का सिर्फ एक enum वस्तु है।

यही है, आपके व्यू मॉडल्स में कोई और चयनसूची नहीं है। मेरे उदाहरण में मैं अपने व्यू मॉडेल में एक enum refrencing कर रहा हूँ, लेकिन आप enum प्रकार को सीधे अपने विचार में प्रतिबिंबित कर सकते हैं। मैं बस सब कुछ साफ और अच्छा बनाने के लिए कर रहा हूँ।

आशा है कि यह सहायक था।

+0

शानदार समाधान! –

+3

वास्तव में महान समाधान। हालांकि, अगर enum में प्रविष्टि में वर्णन विशेषता नहीं है, तो यह विफल हो जाती है। तो 'FirstOrDefault() 'और 'आइटम्स' के बजाय' .irst() 'को प्रतिस्थापित करें। जोड़ें (मान, attrs.GetName());' आइटम हैं। जोड़ें (मान, attrs! = Null? Attrs.GetName (): value.ToString()); 'यह आपको स्पष्ट एनम प्रविष्टियों के विवरण में टाइपिंग सहेजता है। – trailmax

+0

किया गया, सुधार के लिए धन्यवाद। –

2

देखो (typeof (मुद्राओं))

1

इतने सारे अच्छे जवाब - मैं (नियंत्रक में और नहीं) को ध्यान में रखते selectList निर्माण कर रहा हूँ - मैं I'sd मेरी समाधान को जोड़ने सोचा:

मेरी सी # में:

namespace ControlChart.Models 
//My Enum 
public enum FilterType { 
[Display(Name = "Reportable")]  
Reportable = 0,  
[Display(Name = "Non-Reportable")]  
NonReportable,  
[Display(Name = "All")]  
All }; 

//My model: 
public class ChartModel { 
[DisplayName("Filter")] 
public FilterType Filter { get; set; } 
} 

में मेरी cshtml:

@using System.ComponentModel.DataAnnotations 
@using ControlChart.Models 
@model ChartMode 
@*..........*@ 
@Html.DropDownListFor(x => x.Filter,       
from v in (ControlChart.Models.FilterType[])(Enum.GetValues(typeof(ControlChart.Models.FilterType))) 
select new SelectListItem() { 
    Text = ((DisplayAttribute)(typeof(FilterType).GetField(v.ToString()).GetCustomAttributes(typeof(DisplayAttribute), false).First())).Name,        
    Value = v.ToString(),        
    Selected = v == Model.Filter       
    }) 

HTH

1

मैं इस पर बहुत देर हो चुकी हूँ, लेकिन मैं सिर्फ एक बहुत अच्छा वा पाया y कोड के एक पंक्ति के साथ ऐसा करने के लिए, यदि आप Unconstrained Melody NuGet पैकेज (जॉन स्कीट से एक अच्छी, छोटी लाइब्रेरी) जोड़ने में खुश हैं।

यह समाधान बेहतर है क्योंकि:

  1. यह (सामान्य प्रकार की कमी के साथ) सुनिश्चित करता है कि मूल्य वास्तव में एक enum मूल्य (स्वैच्छिक मेलोडी के कारण)
  2. यह अनावश्यक मुक्केबाजी (स्वैच्छिक मेलोडी की वजह से बचा जाता है है)
  3. यह प्रत्येक कॉल पर प्रतिबिंब का उपयोग करने से बचने के लिए सभी विवरणों को कैश करता है (Unconstrained Melody के कारण)
  4. यह अन्य समाधानों की तुलना में कम कोड है!

    1. पैकेज प्रबंधक कंसोल में, "स्थापित-पैकेज UnconstrainedMelody"
    2. इसलिए की तरह अपने मॉडल पर एक संपत्ति जोड़ें::

    तो, यहां दिए गए चरणों इस काम कर पाने के लिए कर रहे हैं

    //Replace "YourEnum" with the type of your enum 
    public IEnumerable<SelectListItem> AllItems 
    { 
        get 
        { 
         return Enums.GetValues<YourEnum>().Select(enumValue => new SelectListItem { Value = enumValue.ToString(), Text = enumValue.GetDescription() }); 
        } 
    } 
    

अब आपके पास अपने मॉडल पर उजागर SelectListItem की सूची है, तो आप इसका उपयोग कर सकते हैं @ Html.DropDownList या @ Html.DropDownList इस संपत्ति का उपयोग स्रोत के रूप में करते हैं।

0

शायद बहुत देर हो चुकी है, लेकिन मुझे लगता है कि यह एक ही समस्या वाले लोगों के लिए उपयोगी हो सकता है। मुझे here मिला है जो अब एमवीसी 5 के साथ EnumDropDownListFor एचटीएमएल सहायक है जो अब कस्टम हेल्पर्स या अन्य वर्कअराउंड्स का उपयोग करने के लिए तैयार नहीं है।

इस विशेष मामले में, बस इस जोड़ें:

@Html.EnumDropDownListFor(x => x.SelectedCurrency) 

और बस!

तुम भी अनुवाद कर सकते हैं या डेटा एनोटेशन और संसाधनों फ़ाइलों के माध्यम से प्रदर्शित पाठ बदलने:

  1. अपने enum के लिए निम्न डेटा टिप्पणियां जोड़ें:

    public enum Currencies 
    { 
        [Display(Name="Currencies_CAD", ResourceType=typeof(Resources.Enums)] 
        CAD, 
        [Display(Name="Currencies_USD", ResourceType=typeof(Resources.Enums)]  
        USD, 
        [Display(Name="Currencies_EUR", ResourceType=typeof(Resources.Enums)] 
        EUR 
    } 
    
  2. इसी संसाधन फ़ाइल बनाएँ।

संबंधित मुद्दे