आप ASP.NET MVC में किसी एनम से ड्रॉपडेललिस्ट कैसे बनाते हैं?


668

मैं Html.DropDownListविस्तार विधि का उपयोग करने की कोशिश कर रहा हूं, लेकिन यह पता नहीं लगा सकता कि इसका उपयोग कैसे किया जाए।

मान लीजिए कि मेरे पास इस तरह का एक ज्ञान है:

public enum ItemTypes
{
    Movie = 1,
    Game = 2,
    Book = 3
}

मैं Html.DropDownListएक्सटेंशन विधि का उपयोग करके इन मूल्यों के साथ ड्रॉपडाउन कैसे बनाऊं ?

या मेरा सबसे अच्छा शर्त केवल लूप बनाने के लिए और एचटीएमएल तत्वों को मैन्युअल रूप से बनाना है?

जवाबों:


841

MVC v5.1 के लिए Html.EnumDropDownListFor का उपयोग करें

@Html.EnumDropDownListFor(
    x => x.YourEnumField,
    "Select My Type", 
    new { @class = "form-control" })

MVC v5 के लिए EnumHelper का उपयोग करें

@Html.DropDownList("MyType", 
   EnumHelper.GetSelectList(typeof(MyType)) , 
   "Select My Type", 
   new { @class = "form-control" })

एमवीसी 5 और उससे कम के लिए

मैंने रुण के उत्तर को विस्तार विधि में रोल किया:

namespace MyApp.Common
{
    public static class MyExtensions{
        public static SelectList ToSelectList<TEnum>(this TEnum enumObj)
            where TEnum : struct, IComparable, IFormattable, IConvertible
        {
            var values = from TEnum e in Enum.GetValues(typeof(TEnum))
                select new { Id = e, Name = e.ToString() };
            return new SelectList(values, "Id", "Name", enumObj);
        }
    }
}

यह आपको लिखने की अनुमति देता है:

ViewData["taskStatus"] = task.Status.ToSelectList();

द्वारा using MyApp.Common


13
मैं इसे काम नहीं कर सका, क्या आप कृपया मदद कर सकते हैं। जब मैं Post.PostType.ToSelectList () करता हूं; यह विस्तार को नहीं पहचानता है?
बारब्रोस अल्प

3
मुझे यह काम करने के लिए नहीं मिला। क्या टास्क क्लास में आपकी एनम प्रॉपर्टी की स्थिति है? क्या यह प्रगणित मूल्यों में से एक नहीं है?
डेरिल

9
आप इसे थोड़ा सीमित कर सकते हैं: जहाँ T: संरचना, असंगत देखें: stackoverflow.com/questions/79126/…
रिचर्ड

8
यह अच्छा है। अगर कोई यहाँ w / कार्यान्वयन से जूझ रहा है तो मैंने यह कैसे किया। एक EnumHelpers वर्ग को HtmlHelpers फ़ोल्डर में जोड़ा गया। उपरोक्त कोड का उपयोग किया। @TodK अनुशंसा के अनुसार नामस्थान जोड़ा गया: <namepace = "xxx.HtmlHelpers" /> जोड़ें। फिर मैंने इसे इस तरह के एक रेजर पेज में इस्तेमाल किया: @ Html.DropDownListFor (model => model.Status, @ Model.Status.ToSelectList ()) HTH
Jeff

6
नोट नए में है कि ASP.NET MVCवहाँ एक देशी तरीका है: stackoverflow.com/a/22295360/1361084
Ofiris

359

मुझे पता है कि मुझे इस पर पार्टी के लिए देर हो रही है, लेकिन सोचा कि आप इस संस्करण को उपयोगी पा सकते हैं, क्योंकि यह आपको ड्रॉप डाउन में एन्यूमरेशन स्थिरांक के बजाय वर्णनात्मक तारों का उपयोग करने की अनुमति देता है। ऐसा करने के लिए, प्रत्येक एन्यूमरेशन प्रविष्टि को [System.ComponentModel.Description] विशेषता के साथ सजाएं।

उदाहरण के लिए:

public enum TestEnum
{
  [Description("Full test")]
  FullTest,

  [Description("Incomplete or partial test")]
  PartialTest,

  [Description("No test performed")]
  None
}

यहाँ मेरा कोड है:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using System.Web.Mvc.Html;
using System.Reflection;
using System.ComponentModel;
using System.Linq.Expressions;

 ...

 private static Type GetNonNullableModelType(ModelMetadata modelMetadata)
    {
        Type realModelType = modelMetadata.ModelType;

        Type underlyingType = Nullable.GetUnderlyingType(realModelType);
        if (underlyingType != null)
        {
            realModelType = underlyingType;
        }
        return realModelType;
    }

    private static readonly SelectListItem[] SingleEmptyItem = new[] { new SelectListItem { Text = "", Value = "" } };

    public static string GetEnumDescription<TEnum>(TEnum 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 MvcHtmlString EnumDropDownListFor<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression)
    {
        return EnumDropDownListFor(htmlHelper, expression, null);
    }

    public static MvcHtmlString EnumDropDownListFor<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression, object htmlAttributes)
    {
        ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
        Type enumType = GetNonNullableModelType(metadata);
        IEnumerable<TEnum> values = Enum.GetValues(enumType).Cast<TEnum>();

        IEnumerable<SelectListItem> items = from value in values
            select new SelectListItem
            {
                Text = GetEnumDescription(value),
                Value = value.ToString(),
                Selected = value.Equals(metadata.Model)
            };

        // If the enum is nullable, add an 'empty' item to the collection
        if (metadata.IsNullableValueType)
            items = SingleEmptyItem.Concat(items);

        return htmlHelper.DropDownListFor(expression, items, htmlAttributes);
    }

आप अपने विचार में ऐसा कर सकते हैं:

@Html.EnumDropDownListFor(model => model.MyEnumProperty)

आशा है कि यह आपकी मदद करता है!

** EDIT 2014-JAN-23: Microsoft ने अभी MVC 5.1 जारी किया है, जिसमें अब EnumDropDownListFor सुविधा है। अफसोस की बात है कि यह [विवरण] विशेषता का सम्मान नहीं करता है इसलिए ऊपर का कोड अभी भी खड़ा है Microsoft के रिलीज़ नोटों में Enum खंड

अद्यतन: यह समर्थन करता है प्रदर्शन विशेषता का[Display(Name = "Sample")] , लेकिन कोई भी इसका उपयोग कर सकता है।

[अपडेट - बस इस पर ध्यान दिया, और कोड यहां कोड के एक विस्तारित संस्करण की तरह दिखता है: https://blogs.msdn.microsoft.com/stuartleeks/2010/05/21/asp-net-mvc-creating-a- dropdownlist-helper-for-enums / , कुछ जोड़ के साथ। यदि ऐसा है, तो एट्रिब्यूशन उचित प्रतीत होगा ;-)]


28
+1 मुझे यहां सभी उत्तरों में यह सबसे उपयोगी लगा। मैं इसे कोड के अत्यधिक पुन: प्रयोज्य टुकड़े में बदलने में सक्षम था। धन्यवाद!
एड चारबेन्यू

43
विजुअल स्टूडियो में एक अजीब बग है जहां यदि आप संदर्भ नहीं देते हैं System.Web.Mvc.Htmlतो यह कहता है कि DropDownListForइसे नहीं पाया जा सकता है, लेकिन न तो इसे हल कर सकते हैं। आपको मैन्युअल रूप से करना होगा using System.Web.Mvc.Html;। बस इतना y'know।
केज़्ज़ेर

1
मेरे पास इसका एक संस्करण है एक जिस्ट
kamranicus

1
महान समाधान, धन्यवाद, और भी बेहतर होगा यदि आप GetEnumDescription के परिणाम कैश कर सकते हैं
एम। मेनन कारा

17
नया MVC 5.1 EnumDropDownListFor [विवरण ("")] का उपयोग नहीं करता है, लेकिन यह [प्रदर्शन (नाम = "") का उपयोग करता है]! आनंद लें :)
सुपरबाइब्स

195

में ASP.NET MVC 5.1 , वे जोड़ा EnumDropDownListFor()सहायक है, तो कस्टम एक्सटेंशन के लिए कोई जरूरत नहीं:

मॉडल :

public enum MyEnum
{
    [Display(Name = "First Value - desc..")]
    FirstValue,
    [Display(Name = "Second Value - desc...")]
    SecondValue
}

देखें :

@Html.EnumDropDownListFor(model => model.MyEnum)

टैग हेल्पर (ASP.NET MVC 6) का उपयोग करना :

<select asp-for="@Model.SelectedValue" asp-items="Html.GetEnumSelectList<MyEnum>()">

21
इसे किसी भी तरह से पहले स्थान पर लाने की आवश्यकता है

3
आपको एक नया प्रश्न बनाना चाहिए जो MVC 5.1 के लिए विशिष्ट हो और इसे उत्तर के रूप में रखा जाए, फिर मुझे पोस्ट का लिंक भेजें ताकि मैं एक पसंदीदा बना सकूं।
केविन हेयड

2
EnumDropDownListFor () के बारे में मुझे जो पसंद नहीं है, वह यह है कि यह डीब में एनुम के अंतर मूल्य को बचाता है, पाठ को नहीं, इसलिए यदि आप कभी भी नई एनम आइटम जोड़ना चुनते हैं, तो यह आवश्यक रूप से सूची के अंत में जाना चाहिए , इसलिए एनम आइटम की मूल स्थितियों में सहेजे गए डेटाबेस int मूल्यों के संबंध को ढीला नहीं करना है। यदि पाठ सहेजा गया है तो यह एक अनावश्यक प्रतिबंध है। इसके अलावा, मैं बजाय db को देखने और एक पाठ को देखने में सक्षम हो सकता हूं, बल्कि उन स्याही की तुलना में जहां मुझे पाठ मानों को कहीं और देखना है। अन्यथा यह HTML सहायक उपयोग करने के लिए बहुत सुविधाजनक है।
गियोवन्नी

2
@ गवन्नी - आप अपने स्वयं के संख्यात्मक मूल्यों को निर्दिष्ट कर सकते हैं।
टॉमी

1
@ गवन्नी स्ट्रिक्ट डिज़ाइन को प्रत्येक एनम एंट्री (यदि यह महत्वपूर्ण है) के लिए मान असाइन करना चाहिए, अन्यथा मान मायने नहीं रखना चाहिए (और इसलिए नए को अंत में रखना एक समस्या नहीं होनी चाहिए)। जब स्टोरेज सेव करना और परफॉरमेंस बढ़ाना (जब कुछ सर्च करना हो) तो इंट वैल्यू सेव करना बेहतर होता है।
राजा राजा

130

मैं एक ही समस्या से टकरा गया, यह सवाल पाया, और सोचा कि ऐश द्वारा प्रदान किया गया समाधान वह नहीं था जिसकी मुझे तलाश थी; स्वयं HTML बनाने के लिए अंतर्निहित Html.DropDownList()फ़ंक्शन की तुलना में कम लचीलेपन का मतलब है ।

C # 3 आदि को चालू करता है और यह बहुत आसान बनाता है। मेरे पास एक enumकॉल है TaskStatus:

var statuses = from TaskStatus s in Enum.GetValues(typeof(TaskStatus))
               select new { ID = s, Name = s.ToString() };
ViewData["taskStatus"] = new SelectList(statuses, "ID", "Name", task.Status);

यह एक अच्छा ओएल 'बनाता SelectListहै जिसका उपयोग उस तरह किया जा सकता है जैसे आप दृश्य में उपयोग किया जाता है:

<td><b>Status:</b></td><td><%=Html.DropDownList("taskStatus")%></td></tr>

अनाम प्रकार और LINQ इसे बहुत अधिक सुरुचिपूर्ण IMHO बनाता है। कोई अपराध नहीं, ऐश। :)


अच्छा उत्तर! मैं उम्मीद कर रहा था कि कोई व्यक्ति linq और SelectList का उपयोग करेगा :) मुझे खुशी है कि मैंने पहले यहाँ जाँच की!
प्योर.क्रोम

1
ID = मुझे DataTextField मान नहीं दे रहा है? क्या कारण हो सकता है? धन्यवाद
Barbaros अल्प

1
Rune, मैंने इसी विधि और DropDownList का उपयोग किया है जब तक यह सर्वर पर पोस्ट करता है, यह मेरे द्वारा चुने गए मूल्य को नहीं बचाता है।
दक्षिणावर्त

5
@BarbarosAlp आईडी के लिए एक नंबर होना चाहिए जो आपको एनम को एक इंट में डालना होगा:select new { ID = (int)s, Name = s.ToString() };
कीथ

यह जवाब मुझे अपनी सादगी के कारण सबसे ज्यादा पसंद है। शर्म की बात है कि आपको चयनित समाधान का उपयोग करने के बाद से पर्याप्त क्रेडिट नहीं मिला।
अनार खलीलोव

63

यहाँ एक बेहतर समझाया समाधान है:

https://www.spicelogic.com/Blog/enum-dropdownlistfor-asp-net-mvc-5

यहाँ कहो कि आपका मॉडल है:

यहाँ छवि विवरण दर्ज करें

नमूना उपयोग:

यहाँ छवि विवरण दर्ज करें

जनरेट किया गया UI: यहाँ छवि विवरण दर्ज करें

और HTML उत्पन्न की

यहाँ छवि विवरण दर्ज करें

हेल्पर एक्सटेंशन सोर्स कोड स्नैप शॉट:

यहाँ छवि विवरण दर्ज करें

आप मेरे द्वारा दिए गए लिंक से नमूना परियोजना डाउनलोड कर सकते हैं।

संपादित करें: यहाँ कोड है:

public static class EnumEditorHtmlHelper
{
    /// <summary>
    /// Creates the DropDown List (HTML Select Element) from LINQ 
    /// Expression where the expression returns an Enum type.
    /// </summary>
    /// <typeparam name="TModel">The type of the model.</typeparam>
    /// <typeparam name="TProperty">The type of the property.</typeparam>
    /// <param name="htmlHelper">The HTML helper.</param>
    /// <param name="expression">The expression.</param>
    /// <returns></returns>
    public static MvcHtmlString DropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper,
        Expression<Func<TModel, TProperty>> expression) 
        where TModel : class
    {
        TProperty value = htmlHelper.ViewData.Model == null 
            ? default(TProperty) 
            : expression.Compile()(htmlHelper.ViewData.Model);
        string selected = value == null ? String.Empty : value.ToString();
        return htmlHelper.DropDownListFor(expression, createSelectList(expression.ReturnType, selected));
    }

    /// <summary>
    /// Creates the select list.
    /// </summary>
    /// <param name="enumType">Type of the enum.</param>
    /// <param name="selectedItem">The selected item.</param>
    /// <returns></returns>
    private static IEnumerable<SelectListItem> createSelectList(Type enumType, string selectedItem)
    {
        return (from object item in Enum.GetValues(enumType)
                let fi = enumType.GetField(item.ToString())
                let attribute = fi.GetCustomAttributes(typeof (DescriptionAttribute), true).FirstOrDefault()
                let title = attribute == null ? item.ToString() : ((DescriptionAttribute) attribute).Description
                select new SelectListItem
                  {
                      Value = item.ToString(), 
                      Text = title, 
                      Selected = selectedItem == item.ToString()
                  }).ToList();
    }
}

2
बस मेरी राय है, लेकिन मुझे लगता है कि यह जवाब स्वीकृत जवाब की तुलना में बहुत साफ है। मुझे विशेष रूप से विवरण विशेषता का उपयोग करने का विकल्प पसंद है। मैंने कोड जोड़ा ताकि लोग इसे डाउनलोड किए बिना कॉपी / पेस्ट कर सकें।
बेन मिल्स

ड्रापडाउनलिस्टस्टॉर के बजाय EnumDropDownListFor के रूप में एक्सटेंशन विधि को कॉल करें: -> @ Html.EnumDropDownListFor (x => x.Gender)
सैंडल तालबेथूला

किसी और के लिए एक और तत्व जोड़ने की तलाश में "कृपया चयन करें" वापसी एचटीएमएल हेल्पर.ड्रोपडाउन लिस्टफ़ोर (अभिव्यक्ति, createSelectList (अभिव्यक्ति ।eturnType, चयनित, FirstElement), "कृपया चुनें");
संदीप

1
ठीक काम करता है! हालाँकि, विवरण पृष्ठ पर, DisplayFor () संबंधित विवरण के बजाय Enum के चयनित मान को दिखाता है। मुझे लगता है कि यह कॉल प्रदर्शन के लिए अधिभार के लिए है () एनम प्रकार के लिए। किसी के पास इसका कोई हल है?
corix010

48

Html.DropDownListFor के लिए केवल IEnumerable की आवश्यकता होती है, इसलिए Prise के समाधान का एक विकल्प इस प्रकार है। यह आपको बस लिखने की अनुमति देगा:

@Html.DropDownListFor(m => m.SelectedItemType, Model.SelectedItemType.ToSelectList())

[जहाँ SelectItemType आपके आइटम प्रकार के मॉडल पर एक फ़ील्ड है, और आपका मॉडल गैर-शून्य है]

इसके अलावा, आपको वास्तव में एक्सटेंशन विधि को जेनेरिक करने की आवश्यकता नहीं है क्योंकि आप टाइपो (टी) के बजाय enumValue.GetType () का उपयोग कर सकते हैं।

संपादित करें: एकीकृत साइमन समाधान यहाँ भी, और ToDescription विस्तार विधि शामिल है।

public static class EnumExtensions
{
    public static IEnumerable<SelectListItem> ToSelectList(this Enum enumValue)
    {
        return from Enum e in Enum.GetValues(enumValue.GetType())
               select new SelectListItem
               {
                   Selected = e.Equals(enumValue),
                   Text = e.ToDescription(),
                   Value = e.ToString()
               };
    }

    public static string ToDescription(this Enum value)
    {
        var attributes = (DescriptionAttribute[])value.GetType().GetField(value.ToString()).GetCustomAttributes(typeof(DescriptionAttribute), false);
        return attributes.Length > 0 ? attributes[0].Description : value.ToString();
    }
}

मेरे लिए काम नहीं करता ('System.NullReferenceException: ऑब्जेक्ट संदर्भ किसी ऑब्जेक्ट के इंस्टेंस पर सेट नहीं है।') ... मेरा 'मॉडल' शून्य है ... संभवतः 'GetNonNullableModelType' के साथ कुछ करना है जो साइमन के पास है। शामिल
शिक्षार्थी

@Cristi, आप सही हैं यह समाधान ऐसी स्थिति में उपयोग करने का इरादा नहीं है जहां आपका मॉडल अशक्त है। मैं सामान्य रूप से इस तरह के डिजाइन से बचने और एक "खाली" मॉडल को शुरू करने की कोशिश करता हूं, जब यह मामला है।
ज़ैद मासुद

ठीक है, मैं asp mvc में नया हूं, लेकिन मेरे पास .Net में काफी अनुभव है। धन्यवाद, मैं देखूंगा कि आप सुझाव दे रहे थे। Btw अपने ToDescription एक्सटेंशन 'Enum' दायरे से बाहर है। मुझे लगता है कि खुद 'ऑब्जेक्ट' के लिए अच्छा है। जब मैंने साइमन का कोड लिया और इसे थोड़ा और साफ किया तो यही मैंने इस्तेमाल किया।
लर्नर

@Cristi यह समझना मुश्किल है कि आप "एनम 'दायरे से बाहर" क्या मतलब है, लेकिन ऐसा लगता है कि आप कह रहे हैं कि ToDescription एक्सटेंशन विधि दृढ़ता से ItemTypes enum में टाइप नहीं की गई है? यह जानबूझकर किया गया है और विस्तार विधि को उदारतापूर्वक सभी enums द्वारा उपयोग करने योग्य बनाता है। यदि आप इसकी तुलना सामान्य विस्तार विधि से कर रहे हैं, तो प्रत्येक दृष्टिकोण के पेशेवरों और विपक्ष हैं। विशेष रूप से, यदि आप इसे सामान्य करते हैं तो आप इसे केवल एनमों पर सीमित नहीं कर सकते।
ज़ैद मसूद

1
महान, धन्यवाद के साथ। मैंने कोई विवरण नहीं होने की स्थिति में FromCamelCase के एक्सटेंशन का उपयोग करने के लिए value.ToString को बदल दिया। यह है कि मैं कैसे रोल करता हूं :)
वलमास

33

तो बिना विस्तार कार्यों के यदि आप सरल और आसान की तलाश में हैं .. तो यही मैंने किया

<%= Html.DropDownListFor(x => x.CurrentAddress.State, new SelectList(Enum.GetValues(typeof(XXXXX.Sites.YYYY.Models.State))))%>

जहां XXXXX.Sites.YYYY.Models.State एक एनम है

शायद हेल्पर फंक्शन करने के लिए बेहतर है, लेकिन जब समय कम होगा तो यह काम पूरा कर देगा।


अच्छा यह ड्रॉपडाउन पॉप्युलेट करने का काम करता है लेकिन आप Html.DropDownListFor के लिए रेजर सिंटैक्स में डिफ़ॉल्ट चयनित मान कैसे सेट करते हैं? मैं एनामो के कॉम्बो बॉक्स के साथ एक तालिका दिखाना चाहता हूं और मुझे पहले के अनुसार चयनित मूल्य निर्धारित करने की आवश्यकता है।
जॉन्च सेप

2
नए SelectList (IEnumerable, ऑब्जेक्ट) फ़ंक्शन के लिए चयनित मान के साथ एक दूसरा पैरामीटर पारित करने में सक्षम होना चाहिए। MSDN Dococumentation: msdn.microsoft.com/en-us/library/dd460123.aspx
मार्टी ट्रेनेथ

23

पुरस्कार और रूण के उत्तरों पर विस्तार करते हुए, यदि आप अपने चयनित सूची आइटम मानचित्र के मूल्य विशेषता को एन्यूमरेशन प्रकार के पूर्णांक मान के बजाय स्ट्रिंग मान के स्थान पर रखना चाहते हैं, तो निम्न कोड का उपयोग करें:

public static SelectList ToSelectList<T, TU>(T enumObj) 
    where T : struct
    where TU : struct
{
    if(!typeof(T).IsEnum) throw new ArgumentException("Enum is required.", "enumObj");

    var values = from T e in Enum.GetValues(typeof(T))
                 select new { 
                    Value = (TU)Convert.ChangeType(e, typeof(TU)),
                    Text = e.ToString() 
                 };

    return new SelectList(values, "Value", "Text", enumObj);
}

प्रत्येक Enumeration value को TEnum ऑब्जेक्ट के रूप में मानने के बजाय, हम इसे ऑब्जेक्ट के रूप में मान सकते हैं और फिर इसे अनबॉक्स किए गए मान को प्राप्त करने के लिए पूर्णांक में डाल सकते हैं।

ध्यान दें: मैंने उन प्रकारों को प्रतिबंधित करने के लिए एक सामान्य प्रकार की बाधा भी जोड़ी है जिसके लिए यह विस्तार केवल संरचना (Enum का आधार प्रकार) के लिए उपलब्ध है, और एक रन-टाइम प्रकार सत्यापन है जो सुनिश्चित करता है कि जो संरचना में पारित हुआ है वह वास्तव में एक Enum है।

अद्यतन 10/23/12: अंतर्निहित प्रकार और फिक्स्ड गैर-संकलन मुद्दे के लिए सामान्य प्रकार के पैरामीटर को जोड़ा गया। .NET 4+ को प्रभावित किया।


धन्यवाद! यह वह उत्तर था जिसकी मुझे आवश्यकता थी। मैं एक Enum के पूर्णांक मान को डेटाबेस में एक कॉलम के रूप में संग्रहीत कर रहा हूं और यह समाधान पूरी तरह से काम कर रहा है।
ग्रिमस

लेकिन क्या होगा अगर आप एक चार और एक इंट स्टोर नहीं कर रहे हैं? जो मेरा मामला है जाहिर है कि मैं (int) को (char) में बदल सकता हूं, लेकिन इस जेनेरिक को कैसे बनाऊं। उसको कैसे करे?
स्टेफनवेड्स

@Stefandvds सही प्रतिनिधित्व प्रकार के कास्टिंग के संबंध में यह एक महान प्रश्न है। मेरे द्वारा किए गए परीक्षणों के आधार पर यह एकमात्र तरीका प्रतीत होगा कि आप इसे प्राप्त करने में सक्षम होंगे यह वास्तविक प्रकार को दूसरे प्रकार के पैरामीटर के रूप में निर्दिष्ट करके होगा। ToSelectList<TEnum, TEnumValue>(this TEnum enumObj) { ... }
नाथन टेलर


यदि आपके Enum के मान int हैं, तो आप बस उपयोग कर सकते हैं Value = Convert.ToInt32(e)(int)eसंकलन नहीं है। :(
एंड्रयू

11

Prise की एक्सटेंशन विधि का उपयोग करके पाठ के बजाय नंबर प्राप्त करने की समस्या को हल करने के लिए।

public static SelectList ToSelectList<TEnum>(this TEnum enumObj)
{
  var values = from TEnum e in Enum.GetValues(typeof(TEnum))
               select new { ID = (int)Enum.Parse(typeof(TEnum),e.ToString())
                         , Name = e.ToString() };

  return new SelectList(values, "Id", "Name", enumObj);
}

यही कारण है कि मैं देख रहा था, हालांकि यह एक बदसूरत है जितना मैंने सोचा था कि यह होना चाहिए। मुझे आश्चर्य है कि क्यों दृश्य स्टूडियो नहीं दूँगी आप सीधे डाली eको int
एंड्रयू

या आप बस का उपयोग कर सकते हैं ID = Convert.ToInt32(e)
एंड्रयू

11

इसे पूरा करने का एक आसान तरीका है - बिना ओवरकिल के लगता है कि सभी एक्सटेंशन सामान यह है:

आपकी दुश्मनी:

    public enum SelectedLevel
    {
       Level1,
       Level2,
       Level3,
       Level4
    }

अपने नियंत्रक के अंदर Enum को एक सूची में बाँधें:

    List<SelectedLevel> myLevels = Enum.GetValues(typeof(SelectedLevel)).Cast<SelectedLevel>().ToList();

उसके बाद इसे ViewBag में फेंक दें:

    ViewBag.RequiredLevel = new SelectList(myLevels);

अंत में बस इसे देखने के लिए बाध्य करें:

    @Html.DropDownList("selectedLevel", (SelectList)ViewBag.RequiredLevel, new { @class = "form-control" })

यह अब तक मैंने पाया सबसे आसान तरीका है और इसके लिए किसी भी एक्सटेंशन या किसी भी चीज की आवश्यकता नहीं है।

अद्यतन : नीचे एंड्रयूज टिप्पणी देखें।


3
यह केवल तभी काम करता है जब आपने अपने एनम को कोई मूल्य नहीं दिया है। यदि आपके पास था Level1 = 1, तो "Level1"इसके बजाय ड्रॉपडाउन का मूल्य होगा 1
एंड्रयू

11

इसके लिए मुझे जो सबसे अच्छा समाधान मिला वह था इस ब्लॉग का संयोजन को साइमन गोल्डस्टोन के जवाब के साथ

यह मॉडल में एनम के उपयोग की अनुमति देता है। अनिवार्य रूप से विचार एक पूर्णांक संपत्ति के साथ-साथ एनम का उपयोग करना है, और पूर्णांक संपत्ति का अनुकरण करना है।

फिर अपने प्रदर्शन पाठ के साथ मॉडल की व्याख्या करने के लिए [System.ComponentModel.Description] विशेषता का उपयोग करें, और अपने दृश्य में "EnumDropDownListFor" एक्सटेंशन का उपयोग करें।

यह देखने और मॉडल दोनों को बहुत पठनीय और बनाए रखने योग्य बनाता है।

नमूना:

public enum YesPartialNoEnum
{
    [Description("Yes")]
    Yes,
    [Description("Still undecided")]
    Partial,
    [Description("No")]
    No
}

//........

[Display(Name = "The label for my dropdown list")]
public virtual Nullable<YesPartialNoEnum> CuriousQuestion{ get; set; }
public virtual Nullable<int> CuriousQuestionId
{
    get { return (Nullable<int>)CuriousQuestion; }
    set { CuriousQuestion = (Nullable<YesPartialNoEnum>)value; }
}

राय:

@using MyProject.Extensions
{
//...
    @Html.EnumDropDownListFor(model => model.CuriousQuestion)
//...
}

एक्सटेंशन (सीधे साइमन गोल्डस्टोन के जवाब से , पूर्णता के लिए यहां शामिल):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.ComponentModel;
using System.Reflection;
using System.Linq.Expressions;
using System.Web.Mvc.Html;

namespace MyProject.Extensions
{
    //Extension methods must be defined in a static class
    public static class MvcExtensions
    {
        private static Type GetNonNullableModelType(ModelMetadata modelMetadata)
        {
            Type realModelType = modelMetadata.ModelType;

            Type underlyingType = Nullable.GetUnderlyingType(realModelType);
            if (underlyingType != null)
            {
                realModelType = underlyingType;
            }
            return realModelType;
        }

        private static readonly SelectListItem[] SingleEmptyItem = new[] { new SelectListItem { Text = "", Value = "" } };

        public static string GetEnumDescription<TEnum>(TEnum 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 MvcHtmlString EnumDropDownListFor<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression)
        {
            return EnumDropDownListFor(htmlHelper, expression, null);
        }

        public static MvcHtmlString EnumDropDownListFor<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression, object htmlAttributes)
        {
            ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
            Type enumType = GetNonNullableModelType(metadata);
            IEnumerable<TEnum> values = Enum.GetValues(enumType).Cast<TEnum>();

            IEnumerable<SelectListItem> items = from value in values
                                                select new SelectListItem
                                                {
                                                    Text = GetEnumDescription(value),
                                                    Value = value.ToString(),
                                                    Selected = value.Equals(metadata.Model)
                                                };

            // If the enum is nullable, add an 'empty' item to the collection
            if (metadata.IsNullableValueType)
                items = SingleEmptyItem.Concat(items);

            return htmlHelper.DropDownListFor(expression, items, htmlAttributes);
        }
    }
}

यह काम नहीं करता है, MVC 4 रेजर। दृश्य या क्रम में, त्रुटि = "कॉल निम्न विधियों या गुणों के बीच अस्पष्ट है। LDN.Extensions.MvcExtensions.EnumDropDownListFor <MyModel, LDN.Models .YesPartialNoEnum?> (System.Web.Mvc.HtmlHelper <MyModper] .Linq.Expressions.Expression <System.Func <MyModel, LDN.Models.YesPartialNoEnum? >>) 'और .... और फिर से एक ही सहारा के साथ ठीक उसी विधि को दोहराया गया (यहाँ पर्याप्त अनुमति नहीं है)।
मार्क


8
@Html.DropDownListFor(model => model.Type, Enum.GetNames(typeof(Rewards.Models.PropertyType)).Select(e => new SelectListItem { Text = e }))

अच्छा! इस तरह से एनम से मूल्य और पाठ कैसे प्राप्त करें? मेरा मतलब है कि मेरे पास SomeEnum {some1 = 1, some2 = 2} है, मुझे सिलेक्शन के पाठ के लिए मूल्य और पाठ (some1, some2) के लिए नंबर (1, 2) प्राप्त करने की आवश्यकता है
दिमित्रेस्की

7

यह रुम और पुरस्कार Enum का उपयोग करने के लिए बदल जवाब है int आईडी के रूप में मान ।

नमूना Enum:

public enum ItemTypes
{
    Movie = 1,
    Game = 2,
    Book = 3
}

विस्तार विधि:

    public static SelectList ToSelectList<TEnum>(this TEnum enumObj)
    {
        var values = from TEnum e in Enum.GetValues(typeof(TEnum))
                     select new { Id = (int)Enum.Parse(typeof(TEnum), e.ToString()), Name = e.ToString() };

        return new SelectList(values, "Id", "Name", (int)Enum.Parse(typeof(TEnum), enumObj.ToString()));
    }

उपयोग का नमूना:

 <%=  Html.DropDownList("MyEnumList", ItemTypes.Game.ToSelectList()) %>

एक्सटेंशन विधि वाले नेमस्पेस आयात करना याद रखें

<%@ Import Namespace="MyNamespace.LocationOfExtensionMethod" %>

उत्पन्न HTML का नमूना:

<select id="MyEnumList" name="MyEnumList">
    <option value="1">Movie</option>
    <option selected="selected" value="2">Game</option>
    <option value="3">Book </option>
</select>

ध्यान दें कि आप जिस आइटम ToSelectListपर कॉल करने के लिए उपयोग करते हैं वह चयनित आइटम है।


या आप बस का उपयोग कर सकते हैं Id = Convert.ToInt32(e)
एंड्रयू

6

यह रेजर के लिए संस्करण है:

@{
    var itemTypesList = new List<SelectListItem>();
    itemTypesList.AddRange(Enum.GetValues(typeof(ItemTypes)).Cast<ItemTypes>().Select(
                (item, index) => new SelectListItem
                {
                    Text = item.ToString(),
                    Value = (index).ToString(),
                    Selected = Model.ItemTypeId == index
                }).ToList());
 }


@Html.DropDownList("ItemTypeId", itemTypesList)

यह तभी काम करेगा जब आपकी एनुम में 0. के साथ शुरू होने वाले सन्निहित मूल्य शामिल हों। ए फ्लैग्स एनम इसके साथ काम नहीं करेगा। अनुक्रमित चयन का रचनात्मक उपयोग, यद्यपि।
Suncat2000

6

.NET कोर में आप इसका उपयोग कर सकते हैं:

@Html.DropDownListFor(x => x.Foo, Html.GetEnumSelectList<MyEnum>())

1
या टैग हेल्पर के साथ <select asp-for="Model.Foo" class="form-control" asp-items="@Html.GetEnumSelectList<MyEnum>()"></select>
पास्कल आर।

हां, मैं कहता हूं कि टैग हेल्पर्स बेहतर होते हैं क्योंकि फॉर्मेट शुद्ध HTML के करीब होता है;)
गोल्डनएज

इसके अलावा आप यह कर सकते हैं @ Html.DropDownListFor (x => x.Foo, Html.GetEnumSelectList (typeof (FooEnum)))
Fereydun Likzehy

6

अब यह सुविधा MVC 5.1 के माध्यम से आउट-ऑफ-द-बॉक्स समर्थित है @Html.EnumDropDownListFor()

निम्नलिखित लिंक की जाँच करें:

https://docs.microsoft.com/en-us/aspnet/mvc/overview/releases/mvc51-release-notes#Enum

यह वास्तव में शर्म की बात है कि इस तरह की सुविधा को लागू करने में Microsoft को 5 साल लग गए जो कि ऊपर मतदान के अनुसार मांग में है!


5

साइमन के उत्तर पर निर्माण, एक समान दृष्टिकोण एनम मूल्यों को संसाधन फ़ाइल से प्रदर्शित करने के लिए है, बजाय एनम के भीतर एक विवरण विशेषता के। यदि आपकी साइट को एक से अधिक भाषाओं में प्रस्तुत करने की आवश्यकता है और यदि आपके पास Enums के लिए एक विशिष्ट संसाधन फ़ाइल है, तो आप एक कदम आगे जा सकते हैं और केवल Enum मान रख सकते हैं, यह उपयोगी है, अपने Enum में और उन्हें विस्तार से देखें एक सम्मेलन जैसे [EnumName] _ [EnumValue] - अंततः कम टाइपिंग!

विस्तार तब दिखता है:

public static IHtmlString EnumDropDownListFor<TModel, TEnum>(this HtmlHelper<TModel> html, Expression<Func<TModel, TEnum>> expression)
{            
    var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);

    var enumType = Nullable.GetUnderlyingType(metadata.ModelType) ?? metadata.ModelType;

    var enumValues = Enum.GetValues(enumType).Cast<object>();

    var items = from enumValue in enumValues                        
                select new SelectListItem
                {
                    Text = GetResourceValueForEnumValue(enumValue),
                    Value = ((int)enumValue).ToString(),
                    Selected = enumValue.Equals(metadata.Model)
                };


    return html.DropDownListFor(expression, items, string.Empty, null);
}

private static string GetResourceValueForEnumValue<TEnum>(TEnum enumValue)
{
    var key = string.Format("{0}_{1}", enumValue.GetType().Name, enumValue);

    return Enums.ResourceManager.GetString(key) ?? enumValue.ToString();
}

Enums.Resx फ़ाइल में संसाधन ItemTypes_Movie की तरह दिख रहे हैं: फिल्म

एक और चीज जो मुझे करना पसंद है, वह है कि एक्सटेंशन विधि को सीधे कॉल करने के बजाय, मैं इसे एक @ Html.EditorFor (x => x.MyProperty) के साथ कॉल करूंगा, या आदर्श रूप से पूरे फॉर्म को एक नीट में " Html.EditorForModel ()। ऐसा करने के लिए मैं इस तरह दिखने के लिए स्ट्रिंग टेम्पलेट को बदलता हूं

@using MVCProject.Extensions

@{
    var type = Nullable.GetUnderlyingType(ViewData.ModelMetadata.ModelType) ?? ViewData.ModelMetadata.ModelType;

    @(typeof (Enum).IsAssignableFrom(type) ? Html.EnumDropDownListFor(x => x) : Html.TextBoxFor(x => x))
}

यदि यह आपकी रुचि है, तो मैंने अपने ब्लॉग पर यहाँ अधिक विस्तृत उत्तर दिया है:

http://paulthecyclist.com/2013/05/24/enum-dropdown/


5

वैसे मैं वास्तव में पार्टी के लिए देर से आया हूं, लेकिन इसके लायक क्या है, मैंने इस विषय के बारे में ब्लॉग किया है जिससे मैं बना हूं EnumHelper वर्ग बनाता जो बहुत आसान परिवर्तन को सक्षम बनाता है।

http://jnye.co/Posts/4/creating-a-dropdown-list-from-an-enum-in-mvc-and-c%23

आपके नियंत्रक में:

//If you don't have an enum value use the type
ViewBag.DropDownList = EnumHelper.SelectListFor<MyEnum>();

//If you do have an enum value use the value (the value will be marked as selected)    
ViewBag.DropDownList = EnumHelper.SelectListFor(MyEnum.MyEnumValue);

आपके विचार में:

@Html.DropDownList("DropDownList")
@* OR *@
@Html.DropDownListFor(m => m.Property, ViewBag.DropDownList as SelectList, null)

सहायक वर्ग:

public static class EnumHelper
{
    // Get the value of the description attribute if the   
    // enum has one, otherwise use the value.  
    public static string GetDescription<TEnum>(this TEnum value)
    {
        var fi = value.GetType().GetField(value.ToString());

        if (fi != null)
        {
            var attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);

            if (attributes.Length > 0)
            {
                return attributes[0].Description;
            }
        }

        return value.ToString();
    }

    /// <summary>
    /// Build a select list for an enum
    /// </summary>
    public static SelectList SelectListFor<T>() where T : struct
    {
        Type t = typeof(T);
        return !t.IsEnum ? null
                         : new SelectList(BuildSelectListItems(t), "Value", "Text");
    }

    /// <summary>
    /// Build a select list for an enum with a particular value selected 
    /// </summary>
    public static SelectList SelectListFor<T>(T selected) where T : struct
    {
        Type t = typeof(T);
        return !t.IsEnum ? null
                         : new SelectList(BuildSelectListItems(t), "Text", "Value", selected.ToString());
    }

    private static IEnumerable<SelectListItem> BuildSelectListItems(Type t)
    {
        return Enum.GetValues(t)
                   .Cast<Enum>()
                   .Select(e => new SelectListItem { Value = e.ToString(), Text = e.GetDescription() });
    }
}

4

मुझे इस पर बहुत देर हो चुकी है, लेकिन मुझे बस कोड की एक पंक्ति के साथ ऐसा करने का एक अच्छा तरीका मिल गया है, अगर आप असंबद्ध मेलोडी को जोड़ने के लिए खुश हैं नुगेट पैकेज (जॉन स्कीट से एक अच्छा, छोटा पुस्तकालय) ।

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

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

तो, यहाँ इस काम को पाने के लिए कदम हैं:

  1. पैकेज मैनेजर कंसोल में, "इंस्टाल-पैकेज अनस्ट्रैस्टर्डमेलोडी"
  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.DropDownListFor का उपयोग कर सकते हैं।


जॉन स्केट के कोड का उपयोग करने के लिए :), सिर्फ एक अच्छा मजाक कर रहा है
वामसी

3

इस एक्सटेंशन पद्धति का एक और निर्धारण - वर्तमान संस्करण ने एनम के वर्तमान मान का चयन नहीं किया। मैंने अंतिम पंक्ति तय की:

public static SelectList ToSelectList<TEnum>(this TEnum enumObj) where TEnum : struct
    {
        if (!typeof(TEnum).IsEnum) throw new ArgumentException("An Enumeration type is required.", "enumObj");

        var values = from TEnum e in Enum.GetValues(typeof(TEnum))
                       select new
                       {
                           ID = (int)Enum.Parse(typeof(TEnum), e.ToString()),
                           Name = e.ToString()
                       };


        return new SelectList(values, "ID", "Name", ((int)Enum.Parse(typeof(TEnum), enumObj.ToString())).ToString());
    }

3

यदि आप स्थानीयकरण समर्थन जोड़ना चाहते हैं, तो s.toString () विधि को कुछ इस तरह बदलें:

ResourceManager rManager = new ResourceManager(typeof(Resources));
var dayTypes = from OperatorCalendarDay.OperatorDayType s in Enum.GetValues(typeof(OperatorCalendarDay.OperatorDayType))
               select new { ID = s, Name = rManager.GetString(s.ToString()) };

यहां टाइपोफ़ (संसाधन) वह संसाधन है जिसे आप लोड करना चाहते हैं, और फिर आपको स्थानीयकृत स्ट्रिंग मिलती है, उपयोगी भी यदि आपके एन्यूमरेटर में कई शब्दों के साथ मान हैं।


3

यह मेरा सहायक विधि का संस्करण है। मैं इसका उपयोग करता हूं:

var values = from int e in Enum.GetValues(typeof(TEnum))
             select new { ID = e, Name = Enum.GetName(typeof(TEnum), e) };

उसके बदले में:

var values = from TEnum e in Enum.GetValues(typeof(TEnum))
           select new { ID = (int)Enum.Parse(typeof(TEnum),e.ToString())
                     , Name = e.ToString() };

यह रहा:

public static SelectList ToSelectList<TEnum>(this TEnum self) where TEnum : struct
    {
        if (!typeof(TEnum).IsEnum)
        {
            throw new ArgumentException("self must be enum", "self");
        }

        Type t = typeof(TEnum);

        var values = from int e in Enum.GetValues(typeof(TEnum))
                     select new { ID = e, Name = Enum.GetName(typeof(TEnum), e) };

        return new SelectList(values, "ID", "Name", self);
    }

3

आप Griffin.MvcContrib में मेरे कस्टम HtmlHelpers का भी उपयोग कर सकते हैं। निम्नलिखित कोड:

@Html2.CheckBoxesFor(model => model.InputType) <br />
@Html2.RadioButtonsFor(model => model.InputType) <br />
@Html2.DropdownFor(model => model.InputType) <br />

उत्पन्न करता है:

यहाँ छवि विवरण दर्ज करें

https://github.com/jgauffin/griffin.mvccontrib


3

मैं इस सवाल का जवाब एक अलग तरीके से देना चाहूंगा जहां, उपयोगकर्ता को controllerया Linqअभिव्यक्ति में कुछ भी करने की आवश्यकता नहीं है । इस तरफ...

मेरे पास एक ENUM

public enum AccessLevelEnum
    {
        /// <summary>
        /// The user cannot access
        /// </summary>
        [EnumMember, Description("No Access")]
        NoAccess = 0x0,

        /// <summary>
        /// The user can read the entire record in question
        /// </summary>
        [EnumMember, Description("Read Only")]
        ReadOnly = 0x01,

        /// <summary>
        /// The user can read or write
        /// </summary>
        [EnumMember, Description("Read / Modify")]
        ReadModify = 0x02,

        /// <summary>
        /// User can create new records, modify and read existing ones
        /// </summary>
        [EnumMember, Description("Create / Read / Modify")]
        CreateReadModify = 0x04,

        /// <summary>
        /// User can read, write, or delete
        /// </summary>
        [EnumMember, Description("Create / Read / Modify / Delete")]
        CreateReadModifyDelete = 0x08,

        /*/// <summary>
        /// User can read, write, or delete
        /// </summary>
        [EnumMember, Description("Create / Read / Modify / Delete / Verify / Edit Capture Value")]
        CreateReadModifyDeleteVerify = 0x16*/
    }

अब मैं सैंटो बस dropdownयह का उपयोग करके बना enum

@Html.DropDownList("accessLevel",new SelectList(AccessLevelEnum.GetValues(typeof(AccessLevelEnum))),new { @class = "form-control" })

या

@Html.DropDownListFor(m=>m.accessLevel,new SelectList(AccessLevelEnum.GetValues(typeof(AccessLevelEnum))),new { @class = "form-control" })

यदि आप किसी इंडेक्स का चयन करना चाहते हैं तो यह प्रयास करें

@Html.DropDownListFor(m=>m.accessLevel,new SelectList(AccessLevelEnum.GetValues(typeof(AccessLevelEnum)) , AccessLevelEnum.NoAccess ),new { @class = "form-control" })

यहां मैंने AccessLevelEnum.NoAccessड्रॉपडाउन का चयन करने के लिए डिफ़ॉल्ट के लिए एक अतिरिक्त पैरामीटर के रूप में उपयोग किया है ।


3

मुझे यहाँ एक उत्तर मिला । हालाँकि, मेरी कुछ बातों में [Description(...)]विशेषता है, इसलिए मैंने इसके लिए समर्थन प्रदान करने के लिए कोड को संशोधित किया है:

    enum Abc
    {
        [Description("Cba")]
        Abc,

        Def
    }


    public static MvcHtmlString EnumDropDownList<TEnum>(this HtmlHelper htmlHelper, string name, TEnum selectedValue)
    {
        IEnumerable<TEnum> values = Enum.GetValues(typeof(TEnum))
            .Cast<TEnum>();

        List<SelectListItem> items = new List<SelectListItem>();
        foreach (var value in values)
        {
            string text = value.ToString();

            var member = typeof(TEnum).GetMember(value.ToString());
            if (member.Count() > 0)
            {
                var customAttributes = member[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
                if (customAttributes.Count() > 0)
                {
                    text = ((DescriptionAttribute)customAttributes[0]).Description;
                }
            }

            items.Add(new SelectListItem
            {
                Text = text,
                Value = value.ToString(),
                Selected = (value.Equals(selectedValue))
            });
        }

        return htmlHelper.DropDownList(
            name,
            items
            );
    }

उम्मीद है की वो मदद करदे।


मैं टाइप = ड्रॉपडाउनलिस्ट के एक सदस्य को वापस करना चाहता हूं। मैं पाठ के साथ अच्छा हूँ =
विवरणअभिव्यक्त करें,

2

@ साइमन गोल्डस्टोन: आपके समाधान के लिए धन्यवाद, यह पूरी तरह से मेरे मामले में लागू किया जा सकता है। एकमात्र समस्या मुझे वीबी में इसका अनुवाद करना है। लेकिन अब यह किया गया है और अन्य लोगों के समय को बचाने के लिए (यदि उन्हें इसकी आवश्यकता है) तो मैं इसे यहां रखूंगा:

Imports System.Runtime.CompilerServices
Imports System.ComponentModel
Imports System.Linq.Expressions

Public Module HtmlHelpers
    Private Function GetNonNullableModelType(modelMetadata As ModelMetadata) As Type
        Dim realModelType = modelMetadata.ModelType

        Dim underlyingType = Nullable.GetUnderlyingType(realModelType)

        If Not underlyingType Is Nothing Then
            realModelType = underlyingType
        End If

        Return realModelType
    End Function

    Private ReadOnly SingleEmptyItem() As SelectListItem = {New SelectListItem() With {.Text = "", .Value = ""}}

    Private Function GetEnumDescription(Of TEnum)(value As TEnum) As String
        Dim fi = value.GetType().GetField(value.ToString())

        Dim attributes = DirectCast(fi.GetCustomAttributes(GetType(DescriptionAttribute), False), DescriptionAttribute())

        If Not attributes Is Nothing AndAlso attributes.Length > 0 Then
            Return attributes(0).Description
        Else
            Return value.ToString()
        End If
    End Function

    <Extension()>
    Public Function EnumDropDownListFor(Of TModel, TEnum)(ByVal htmlHelper As HtmlHelper(Of TModel), expression As Expression(Of Func(Of TModel, TEnum))) As MvcHtmlString
        Return EnumDropDownListFor(htmlHelper, expression, Nothing)
    End Function

    <Extension()>
    Public Function EnumDropDownListFor(Of TModel, TEnum)(ByVal htmlHelper As HtmlHelper(Of TModel), expression As Expression(Of Func(Of TModel, TEnum)), htmlAttributes As Object) As MvcHtmlString
        Dim metaData As ModelMetadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData)
        Dim enumType As Type = GetNonNullableModelType(metaData)
        Dim values As IEnumerable(Of TEnum) = [Enum].GetValues(enumType).Cast(Of TEnum)()

        Dim items As IEnumerable(Of SelectListItem) = From value In values
            Select New SelectListItem With
            {
                .Text = GetEnumDescription(value),
                .Value = value.ToString(),
                .Selected = value.Equals(metaData.Model)
            }

        ' If the enum is nullable, add an 'empty' item to the collection
        If metaData.IsNullableValueType Then
            items = SingleEmptyItem.Concat(items)
        End If

        Return htmlHelper.DropDownListFor(expression, items, htmlAttributes)
    End Function
End Module

अंत आप इसे इस तरह उपयोग करते हैं:

@Html.EnumDropDownListFor(Function(model) (model.EnumField))

2

मैंने एक्सेप्टन मेथड बनाने का काम किया, जो कि अनिवार्य रूप से यहाँ उत्तर को स्वीकार करने के लिए है। Gist का अंतिम आधा Enum के साथ विशेष रूप से संबंधित है।

https://gist.github.com/3813767


2
@Html.DropdownListFor(model=model->Gender,new List<SelectListItem>
{
 new ListItem{Text="Male",Value="Male"},
 new ListItem{Text="Female",Value="Female"},
 new ListItem{Text="--- Select -----",Value="-----Select ----"}
}
)

2
@Html.DropDownListFor(model => model.MaritalStatus, new List<SelectListItem> 
{  

new SelectListItem { Text = "----Select----", Value = "-1" },


new SelectListItem { Text = "Marrid", Value = "M" },


 new SelectListItem { Text = "Single", Value = "S" }

})

मुझे लगता है कि यह एक वैध उत्तर नहीं है, यह ड्रॉपडाउन को आबाद करने के लिए एनम का उपयोग नहीं कर रहा है।
एंड्रयू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.