আমি জানি যে আমি এই বিষয়ে পার্টিতে দেরি করেছি, তবে ভেবেছিলাম আপনি এই বৈকল্পিকটিকে দরকারী বলে মনে করতে পারেন, কারণ এটি আপনাকে ড্রপ ডাউনে গণনা স্থির চেয়ে বর্ণনামূলক স্ট্রিং ব্যবহার করতে দেয়। এটি করার জন্য, প্রতিটি সিস্টেমের একটি [সিস্টেম.কম্পোনমোডেল.ডেসক্রিপশন] বৈশিষ্ট্য দিয়ে সাজান entry
উদাহরণ স্বরূপ:
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)
আশা করি এটি আপনাকে সাহায্য করবে!
** সম্পাদনা 2014-জানু -23: মাইক্রোসফ্ট সদ্য এমভিসি 5.1 প্রকাশ করেছে, যার এখন একটি এনামড্রপডাউনলিস্টের বৈশিষ্ট্য রয়েছে। দুঃখজনকভাবে এটি [বিবরণ] বৈশিষ্ট্যটিকে সম্মান করে বলে মনে হয় না সুতরাং উপরের কোডটি এখনও দাঁড়িয়ে আছে M এমভিসি 5.1 এর জন্য মাইক্রোসফ্টের প্রকাশিত নোটগুলিতে এনাম বিভাগটি দেখুন ।
আপডেট: এটি যদিও ডিসপ্লে অ্যাট্রিবিউটকে সমর্থন করে [Display(Name = "Sample")]
তাই কোনও এটি ব্যবহার করতে পারে।
[আপডেট - সবেমাত্র এটি লক্ষ্য করা গেছে, এবং কোডটি এখানে কোডের একটি বর্ধিত সংস্করণের মতো দেখাচ্ছে: https://blogs.msdn.microsoft.com/stuartleeks/2010/05/21/asp-net-mvc-creating-a- ড্রপডাউনলিস্ট-সহায়ক-এনামস-এর জন্য , কয়েকটি সংযোজন রয়েছে। যদি তা হয় তবে এট্রিবিউটটি ন্যায্য মনে হবে ;-)]