मुझे पता है कि मुझे इस पर पार्टी के लिए देर हो रही है, लेकिन सोचा कि आप इस संस्करण को उपयोगी पा सकते हैं, क्योंकि यह आपको ड्रॉप डाउन में एन्यूमरेशन स्थिरांक के बजाय वर्णनात्मक तारों का उपयोग करने की अनुमति देता है। ऐसा करने के लिए, प्रत्येक एन्यूमरेशन प्रविष्टि को [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 / , कुछ जोड़ के साथ। यदि ऐसा है, तो एट्रिब्यूशन उचित प्रतीत होगा ;-)]