আপনি কীভাবে এএসপি.নেট এমভিসিতে একটি এনাম থেকে ড্রপডাউনলিস্ট তৈরি করবেন?


668

আমি Html.DropDownListএক্সটেনশন পদ্ধতিটি ব্যবহার করার চেষ্টা করছি তবে একটি গণনা দিয়ে কীভাবে এটি ব্যবহার করব তা অনুমান করতে পারছি না।

ধরা যাক আমার এইরকম একটি গণনা রয়েছে:

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

Html.DropDownListএক্সটেনশন পদ্ধতিটি ব্যবহার করে কীভাবে আমি এই মানগুলির সাথে একটি ড্রপডাউন তৈরি করতে যাব ?

অথবা লুপের জন্য সহজভাবে একটি এইচটিএমএল উপাদানগুলি নিজেই তৈরি করতে আমার সেরা বেট?

উত্তর:


841

এমভিসি ভি 5.1 এর জন্য এইচটিএমএল.ইনুমড্রপডাউনলিস্টফোর্ড ব্যবহার করুন

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

এমভিসি ভি 5 এর জন্য এনামহেল্পার ব্যবহার করুন

@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
আমি এটি কাজ করতে পারে না, আপনি দয়া করে সাহায্য করতে পারেন। যখন আমি পোস্ট.পস্টটাইপ.টোসিলিটলিস্ট () করি; এটা এক্সটেনশন চিনতে পারে না?
বার্বারোস অ্যাল্প

3
আমি এটি কাজ করতে পারে না। টাস্ক ক্লাসে আপনার এনাম সম্পত্তি স্থিতি? এটি কি গণিত মানগুলির মধ্যে একটি নয়?
ড্যারিল

9
কোথায় টি: struct হয়, IConvertible দেখতে এটির সাথে একটি সামান্য বিট সীমিত করতে পারে stackoverflow.com/questions/79126/...
রিচার্ড Garside

8
এটি দুর্দান্ত। যদি কেউ ডাব্লু / বাস্তবায়নে লড়াই করে থাকেন তবে আমি এখানে এটি কীভাবে করেছি। এইচটিএমএল হেল্পার্স ফোল্ডারে একটি এনামহেল্পার ক্লাস যুক্ত করা হয়েছে। উপরের কোডটি ব্যবহার করেছেন। @ টডক সুপারিশ অনুসারে নেমস্পেস যুক্ত করা হয়েছে: <যোগ করুন নামস্থান = "এক্সএক্সএক্সএইচটিএমএল হেলপারস" />। তারপরে আমি এটিকে একটি রেজার পৃষ্ঠায় ব্যবহার করেছি: @ এইচটিএমএল.ড্রপডাউনলিস্টফোর্ড (মডেল => মডেল St স্ট্যাটাস, @ মডেল.স্ট্যাটাস.টোসিলিটলিস্ট ()) এইচটিএইচ
জেফ বোর্ডেন

6
নোট নতুন যে ASP.NET MVCসেখানে একটি নেটিভ উপায় হল: stackoverflow.com/a/22295360/1361084
Ofiris

359

আমি জানি যে আমি এই বিষয়ে পার্টিতে দেরি করেছি, তবে ভেবেছিলাম আপনি এই বৈকল্পিকটিকে দরকারী বলে মনে করতে পারেন, কারণ এটি আপনাকে ড্রপ ডাউনে গণনা স্থির চেয়ে বর্ণনামূলক স্ট্রিং ব্যবহার করতে দেয়। এটি করার জন্য, প্রতিটি সিস্টেমের একটি [সিস্টেম.কম্পোনমোডেল.ডেসক্রিপশন] বৈশিষ্ট্য দিয়ে সাজান 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- ড্রপডাউনলিস্ট-সহায়ক-এনামস-এর জন্য , কয়েকটি সংযোজন রয়েছে। যদি তা হয় তবে এট্রিবিউটটি ন্যায্য মনে হবে ;-)]


28
+1 আমি এখানে সমস্ত উত্তরগুলির মধ্যে এটি সবচেয়ে দরকারী বলে মনে করেছি। আমি এটিকে কোডের পুনরায় ব্যবহারযোগ্য টুকরোতে পরিণত করতে সক্ষম হয়েছি। ধন্যবাদ!
এড চার্বিনিউ

43
ভিজ্যুয়াল স্টুডিওতে একটি অদ্ভুত বাগ রয়েছে যেখানে আপনি যদি উল্লেখ না করেন System.Web.Mvc.Htmlতবে এটি বলে যে এটি DropDownListForপাওয়া যায় না, তবে এটির সমাধানও করতে পারে না। আপনাকে ম্যানুয়ালি করতে হবে using System.Web.Mvc.Html;। ঠিক তাই তুমি জানো
কেজ্জার


1
গ্রেট সলিউশন, ধন্যবাদ, যদি আপনি গেটইনুম বিবরণীর ফলাফলগুলি ক্যাশে করতে পারেন তবে আরও ভাল হতে পারে
এম মেনানান কারা

17
নতুন এমভিসি 5.1 এনামড্রপডাউনলিস্টফোর্ড [বর্ণনা ("")] ব্যবহার করে না তবে এটি [প্রদর্শন (নাম = "")] ব্যবহার করে না! উপভোগ করুন :)
সুপারজিবস

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)

ট্যাগ হেল্পার (এএসপি.নেট এমভিসি 6) ব্যবহার করে :

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

21
এটিকে কোনও একরকম প্রথম স্থান পর্যন্ত ধাক্কা দেওয়া দরকার

3
আপনার এমভিসি 5.1 এর সাথে সুনির্দিষ্ট একটি নতুন প্রশ্ন তৈরি করা উচিত এবং এটিকে উত্তর হিসাবে রেখে দেওয়া উচিত, তারপরে আমাকে পোস্টে একটি লিঙ্ক প্রেরণ করুন যাতে আমি কোনও প্রিয়কে উজ্জীবিত করতে পারি।
কেভিন হাইড

2
এনামড্রপডাউনলিস্টফোর্ড () সম্পর্কে আমি যা পছন্দ করি না তা হ'ল এটি ডিবিতে এনামের ইনট মানটি সংরক্ষণ করে, না পাঠ্য, সুতরাং আপনি যদি কোনও নতুন এনাম আইটেম যুক্ত করতে চান, তবে অবশ্যই এটি অবশ্যই তালিকার শেষে যেতে হবে , যাতে এনাম আইটেমগুলির মূল অবস্থানের সাথে সংরক্ষিত ডাটাবেস ইন্ট মানগুলির সম্পর্কটি আলগা না করে। পাঠ্যটি সংরক্ষণ করা হলে এটি একটি অপ্রয়োজনীয় সীমাবদ্ধতা। আরও, আমি বরং ডিবিতে দেখতে এবং একটি পাঠ্য দেখতে সক্ষম হব, বরং আমার যেখানে অন্য কোথাও পাঠ্যের মানগুলি সন্ধান করতে হবে তার চেয়ে বেশি লেখা। অন্যথায় এই এইচটিএমএল সহায়কটি ব্যবহার করা খুব সুবিধাজনক।
জিওভান্নি

2
@ জিওভান্নি - আপনি নিজের সংখ্যার মান উল্লেখ করতে পারেন।
টমি

1
@ জিওভান্নি স্ট্রিক্ট ডিজাইনের প্রতিটি এনাম প্রবেশের জন্য মূল্য নির্ধারণ করা উচিত (এটি গুরুত্বপূর্ণ), অন্যথায় মানটি বিবেচনা করা উচিত নয় (এবং তাই নতুনটিকে শেষের দিকে রাখার সমস্যা হওয়া উচিত নয়)। স্টোরেজ সংরক্ষণ এবং ক্রমবর্ধমান কর্মক্ষমতা (যখন কিছু অনুসন্ধান করার সময়) বাড়ানোর কথা আসে তখন মানগুলির সংরক্ষণ করা ভাল।
কিং কিং

130

আমি একই সমস্যায় ফেটে পড়েছি, এই প্রশ্নটি পেয়েছি এবং ভেবেছিলাম যে অ্যাশের দেওয়া সমাধানটি আমি খুঁজছিলাম তা নয়; এইচটিএমএল নিজে তৈরি করা মানে বিল্ট-ইন Html.DropDownList()ফাংশনটির তুলনায় কম নমনীয়তা ।

সি # 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>

বেনামে টাইপ এবং লিনকিউ এটিকে আরও অনেক মার্জিত আইএমএইচও করে তোলে। কোনও অপরাধের উদ্দেশ্য নেই, অ্যাশ। :)


ভাল উত্তর! আমি আশা করছিলাম যে কেউ লিনক এবং সিলেকলিস্ট ব্যবহার করবে :) খুশি আমি প্রথমে এখানে চেক করেছি!
বিশুদ্ধ.ক্রোম

1
আইডি = গুলি আমাকে ডেটা টেক্সটফিল্ডের মান দেয় না? কি কারণ হতে পারে ? আপনাকে ধন্যবাদ
বারবারোস অ্যাল্প

1
রুন, আমি এই একই পদ্ধতিটি ব্যবহার করেছি এবং ড্রপডাউনলিস্ট সার্ভারে পোস্ট করার পরে এখনও রেন্ডার করে, এটি আমার নির্বাচিত মানটি সংরক্ষণ করে না।
ঘড়ির

5
@ বারবারোসএলপ আইডি হওয়ার জন্য একটি নম্বর হতে আপনাকে এনামটি ইনট করার প্রয়োজন:select new { ID = (int)s, Name = s.ToString() };
কিথ

এটির সরলতার কারণেই আমি উত্তরটি সবচেয়ে পছন্দ করি। লজ্জাজনক যে নির্বাচিত উত্তরটি আপনার সমাধান ব্যবহার করেছে সেহেতু আপনি পর্যাপ্ত creditণ পান নি।
আনার খলিলভ

63

এখানে একটি আরও ভাল এনক্যাপসুলেটেড সমাধান:

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

বলুন এখানে আপনার মডেল:

এখানে চিত্র বর্ণনা লিখুন

নমুনা ব্যবহার:

এখানে চিত্র বর্ণনা লিখুন

উত্পন্ন উত্স: এখানে চিত্র বর্ণনা লিখুন

এবং উত্পন্ন এইচটিএমএল

এখানে চিত্র বর্ণনা লিখুন

সহায়ক সম্প্রসারণ উত্স কোড স্ন্যাপ শট:

এখানে চিত্র বর্ণনা লিখুন

আমার দেওয়া লিঙ্কটি থেকে আপনি নমুনা প্রকল্পটি ডাউনলোড করতে পারেন।

সম্পাদনা: কোডটি এখানে:

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
কেবল আমার মতামত, তবে আমি মনে করি এই উত্তরটি গৃহীত উত্তরের চেয়ে অনেক পরিষ্কার। আমি বিশেষত বর্ণনা বৈশিষ্ট্যটি ব্যবহারের বিকল্পটি পছন্দ করি। আমি কোডটি যুক্ত করেছি যাতে লোকেরা এটি ডাউনলোড না করেই অনুলিপি / অনুলিপি করতে পারে।
বেন মিলস 20

ড্রপডাউনলিস্টফোর্ডের ব্যবহারের পরিবর্তে এক্সটেনশন পদ্ধতিটিকে এনুমড্রপডাউনলিস্টফর্ম হিসাবে কল করুন: -> @ এইচটিএমএল.ইনুমড্রপডাউনলিস্টফোর্ড (x => x.Gender)
সন্দীপ তালাথুল

কারও জন্য আরও একটি উপাদান যুক্ত করার সন্ধানের জন্য "দয়া করে নির্বাচন করুন" এইচটিএমএল হেল্পার নির্বাচন করুন ropড্রপডাউনলিস্টফোর্ড (এক্সপ্রেশন, ক্রিয়েটলিস্টলিস্ট (এক্সপ্রেশন। রিটারনটাইপ, নির্বাচিত, ফার্স্ট এলিমেন্ট), "দয়া করে নির্বাচন করুন");
সন্দীপ

1
ঠিকভাবে কাজ করে! তবে বিশদ পৃষ্ঠায় ডিসপ্লেফোর্ড () সংশ্লিষ্ট বর্ণনার পরিবর্তে এনামের নির্বাচিত মান দেখায়। আমি মনে করি এটি এনাম টাইপের জন্য ডিসপ্লেফোর্ডের জন্য একটি ওভারলোডের জন্য কল করে। কারও কি এর সমাধান আছে?
corix010

48

এইচটিএমএল.ড্রপডাউনলিস্টফোর্ডের জন্য কেবলমাত্র একটি অনুমিত পরিমাণ প্রয়োজন, সুতরাং প্রাইজের সমাধানের বিকল্পটি নিম্নরূপ। এটি আপনাকে সহজভাবে লেখার অনুমতি দেবে:

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

[যেখানে নির্বাচিত আইটেমটাইপ আপনার আইটেম টাইপ প্রকারের মডেলের একটি ক্ষেত্র, এবং আপনার মডেলটি শূন্য নয়]

এছাড়াও, আপনাকে প্রকৃতপক্ষে সম্প্রসারণের পদ্ধতিটি জেনারাইজ করার দরকার নেই কারণ আপনি টাইপফ (টি) এর পরিবর্তে এনামভ্যালু.গেটটাইপ () ব্যবহার করতে পারেন।

সম্পাদনা: এখানেও ইন্টিগ্রেটেড সাইমন এর সমাধান এবং এতে টোডেসক্রিপশন এক্সটেনশন পদ্ধতি অন্তর্ভুক্ত।

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();
    }
}

আমার জন্য কাজ করে না ('সিস্টেম.নুলআরফারেন্স এক্সেপশন: অবজেক্ট রেফারেন্স কোনও অবজেক্টের উদাহরণে সেট করা নেই।') ... আমার 'মডেল' নাল ... সম্ভবত 'গেটনননলেবলমডেলটাইপ' এর সাথে কিছু করার আছে যা সাইমনটির রয়েছে অন্তর্ভুক্ত
লার্নার

ক্রিস্টি, আপনি ঠিক বলেছেন এই সমাধানটি এমন কোনও অবস্থাতে ব্যবহারের উদ্দেশ্যে নয় যেখানে আপনার মডেলটি নালাগুলি। আমি সাধারণভাবে এই জাতীয় নকশা এড়াতে চেষ্টা করি এবং যখন এটি হয় তখন "খালি" মডেলটি শুরু করি।
জায়েদ মাসুদ

ঠিক আছে, আমি এসপি এমভিসি তে নতুন, তবে। নেট সম্পর্কে আমার বেশ অভিজ্ঞতা আছে। আপনাকে ধন্যবাদ, আমি আপনাকে পরামর্শ দিচ্ছিলাম তা সন্ধান করব। বিটিডব্লিউ আপনার টোডেসক্রিপশন এক্সটেনশান 'এনুম' সুযোগের বাইরে far আমার ধারণা 'অবজেক্ট' নিজেই ভাল goes সাইমন কোডটি নিয়ে গিয়ে আরও কিছুটা পরিষ্কার করার সময় আমি এটি ব্যবহার করেছি।
শিক্ষানবিশ

@ ক্রিসিটি "'এনুম' স্কোপের বাইরে" বলতে আপনার অর্থ কি বোঝা মুশকিল তবে আপনি মনে করছেন যে আপনি বলছেন যে টোডেস্ক্রিপশন এক্সটেনশন পদ্ধতিটি আইটেমটাইপস এনামে শক্তভাবে টাইপ করা হয়নি? এটি ইচ্ছাকৃত এবং এক্সটেনশন পদ্ধতিটি সমস্ত এনাম দ্বারা সাধারণভাবে ব্যবহারযোগ্য করে তোলে। আপনি যদি এটি একটি জেনেরিক এক্সটেনশন পদ্ধতির সাথে তুলনা করে থাকেন তবে প্রতিটি পদ্ধতির পক্ষে বিভিন্ন মত রয়েছে। বিশেষত, আপনি উত্পন্ন হলে আপনি এটি কেবল এনামগুলিতেই সীমাবদ্ধ রাখতে পারবেন না।
জায়েদ মাসুদ

1
ধন্যবাদ, ধন্যবাদ। আমি মান পরিবর্তন করেছি T আমি এভাবেই রোল করছি :)
ভালামাস

33

সুতরাং এক্সটেনশন ফাংশন ছাড়াই আপনি যদি সহজ এবং সহজ খুঁজছেন .. এটি আমি করেছি

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

যেখানে XXXXX.Sites.YYYY.Models.State একটি এনাম

সম্ভবত সাহায্যকারীর কাজটি আরও ভাল, তবে সময় কম হলে এটি কাজটি করবে।


ড্রপডাউনটি জনবহুল করে তোলার কাজ করেছে তবে আপনি এইচটিএমএল.ড্রপডাউনলিস্টফোর্ডের জন্য রেজার সিনট্যাক্সে ডিফল্ট নির্বাচিত মানটি কীভাবে সেট করবেন? আমি এনামগুলির কম্বো বাক্স সহ একটি টেবিলটি দেখাতে চাই এবং আমার নির্বাচিত মানটি আগে যা ছিল তা অনুসারে সেট করতে হবে।
Johncl

2
নতুন নির্বাচিত তালিকা (আইইনিউমারেবল, অবজেক্ট) ফাংশনে নির্বাচিত মান সহ একটি দ্বিতীয় প্যারামিটারটি পাস করতে সক্ষম হওয়া উচিত। দুটিই MSDN Dococumentation: msdn.microsoft.com/en-us/library/dd460123.aspx
মার্টি Trenouth

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);
}

প্রতিটি এনুমুরেশন মানটিকে TEnum অবজেক্ট হিসাবে বিবেচনা করার পরিবর্তে, আমরা এটিকে একটি অবজেক্ট হিসাবে বিবেচনা করতে পারি এবং তারপরে আনবক্সবিহীন মান পেতে এটি পূর্ণসংখ্যায় কাস্ট করতে পারি।

দ্রষ্টব্য: আমি এই প্রকারটি কেবল স্ট্রাক্টগুলিতে (এনামের বেস ধরণের) জন্য সীমাবদ্ধ করার জন্য একটি জেনেরিক ধরণের সীমাবদ্ধতাও যুক্ত করেছি এবং রান-টাইম ধরণের বৈধতা যা নিশ্চিত করে যে কাঠামোটি অবশ্যই পাস হয়েছে তা এনুম।

আপডেট 10/23/12: অন্তর্নিহিত প্রকারের জন্য জেনেরিক ধরণের পরামিতি যুক্ত করা হয়েছে এবং। নেট 4+ প্রভাবিত স্থির নন-সংকলন ইস্যুটিকে প্রভাবিত করে।


ধন্যবাদ! এই আমার উত্তর প্রয়োজন ছিল। আমি ডাটাবেসে একটি এনামের পূর্ণসংখ্যা মানটি কলাম হিসাবে সংরক্ষণ করছি এবং এই সমাধানটি পুরোপুরি কার্যকরভাবে কাজ করছে বলে মনে হচ্ছে।
গ্রিমাস

তবে আপনি যদি একটি চর সংরক্ষণ এবং না কোন int হয়? যা আমার ক্ষেত্রে। স্পষ্টতই আমি (অন্তর্) থেকে (চরে) পরিবর্তন করতে পারি তবে কীভাবে এই জেনেরিক তৈরি করা যায়। কিভাবে যে কি?
স্টেফানভিডস

@ স্টেফ্যান্ডভিডস সঠিক প্রতিনিধিত্বমূলক ধরণের ক্ষেত্রে কাস্টিংয়ের ক্ষেত্রে এটি একটি দুর্দান্ত প্রশ্ন। আমি স্রেফ সম্পাদিত পরীক্ষাগুলির উপর ভিত্তি করে এটিই আপনি এটি অর্জন করতে সক্ষম হবেন এটিই কেবল আসল প্রকারটিকে অন্য ধরণের পরামিতি হিসাবে নির্দিষ্ট করে দেখানো হবে। ToSelectList<TEnum, TEnumValue>(this TEnum enumObj) { ... }
নাথান টেলর

@ স্টেফ্যান্ডভিডস এই প্রশ্নটি দেখুন
নাথন টেলর

যদি আপনার এনমের মানগুলি অন্তর্নিহিত হয় তবে আপনি সহজভাবে ব্যবহার করতে পারেন Value = Convert.ToInt32(e)(int)eসংকলন করে না :(
অ্যান্ড্রু

11

প্রাইজের এক্সটেনশন পদ্ধতিটি ব্যবহার করে পাঠ্যের পরিবর্তে নম্বর পাওয়ার সমস্যাটি সমাধান করতে।

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
    }

আপনার নিয়ামকের ভিতরে এনামকে একটি তালিকায় আবদ্ধ করুন:

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

এর পরে এটিকে একটি ভিউব্যাগে ফেলে দিন:

    ViewBag.RequiredLevel = new SelectList(myLevels);

অবশেষে এটিকে দৃশ্যের সাথে আবদ্ধ করুন:

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

এটি এখন পর্যন্ত সবচেয়ে সহজতম উপায় আমি খুঁজে পেয়েছি এবং এর জন্য কোনও এক্সটেনশন বা পাগল এমন কোনও কিছুর প্রয়োজন নেই।

আপডেট : নীচে অ্যান্ড্রুজ মন্তব্য দেখুন।


3
এটি কেবল তখনই কাজ করে যদি আপনি নিজের এনামের জন্য কোনও মূল্য নির্ধারণ না করেন। যদি আপনার কাছে থাকে Level1 = 1তবে ড্রপডাউনটির মান "Level1"পরিবর্তে হবে 1
অ্যান্ড্রু

11

সবচেয়ে ভালো সমাধান আমি এই জন্য পাওয়া মিশ্রন ছিল এই ব্লগের সঙ্গে সাইমন গোল্ডস্টোন এর উত্তর

এটি মডেলটিতে এনাম ব্যবহারের অনুমতি দেয়। মূলত ধারণাটি হ'ল এনজয়ের পাশাপাশি একটি পূর্ণসংখ্যার সম্পত্তি ব্যবহার করা এবং পূর্ণসংখ্যার সম্পত্তি অনুকরণ করা।

তারপরে আপনার প্রদর্শন পাঠ্যের সাহায্যে মডেলটি বর্জন করার জন্য [সিস্টেম.কম্পোনমেন্টমোডেল। বিবরণ] বৈশিষ্ট্যটি ব্যবহার করুন এবং আপনার দৃষ্টিতে একটি "এনামড্রপডাউনলিস্টফোর্ড" এক্সটেনশন ব্যবহার করুন।

এটি দর্শন এবং মডেল উভয়ই খুব পঠনযোগ্য এবং রক্ষণাবেক্ষণযোগ্য করে তোলে।

মডেল:

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);
        }
    }
}

এটি কাজ করে না, এমভিসি 4 রেজার। ভিউ বা রানটাইম-এ, ত্রুটি = "নিম্নলিখিত পদ্ধতিগুলি বা বৈশিষ্ট্যগুলির মধ্যে 'এলডিএন.এক্সটেনশনস M এমভিসিএক্সটেনশনস n এনডমড্রপডাউনলিস্টের জন্য <মাইমডেল, এলডিএন.মোডেলস es ইয়েস পার্টিশনালনোইনুম?> (সিস্টেম. ওয়েবে.এমভিসি.এইচটিএমএল হেল্ড <মাইন্ড .লিনক.এক্সপ্রেসনস.এক্সপ্রেশন <সিস্টেম.ফান্চ <মাইমোডেল, এলডিএন.মোডেলস.ইয়েস পার্টিয়াল নো ইন্নাম? >>) 'এবং .... "এবং একই প্রপসগুলির সাথে সেই একই পদ্ধতিটি পুনরাবৃত্তি হয়েছে (এখানে পর্যাপ্ত অক্ষর অনুমোদিত নয়)।
মার্চ


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

ভাল! এইভাবে এনুম থেকে কীভাবে মূল্য এবং পাঠ্য পাওয়া যায়? মানে আমার সুমেনাম {কিছু 1 = 1, কিছু 2 = 2 select নির্বাচিত তালিকার পাঠ্যের জন্য আমার মান এবং পাঠ্যের জন্য (1, 2) নম্বর পেতে হবে
দিমিত্রেস্কি

7

এনাম intমান আইডি হিসাবে ব্যবহারের জন্য এটি রুন ও পুরষ্কারের উত্তরসমূহ ।

নমুনা এনাম:

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 দিয়ে শুরু হওয়া সংগত মানগুলি থাকে তবে একটি পতাকা এনাম এটি দিয়ে কাজ করবে না। সূচকযুক্ত নির্বাচন সৃজনশীল ব্যবহার, যদিও।
সানক্যাট 2000

6

নেট কোরটিতে আপনি কেবল এটি ব্যবহার করতে পারেন:

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

1
অথবা ট্যাগ হেল্পারের সাথে <select asp-for="Model.Foo" class="form-control" asp-items="@Html.GetEnumSelectList<MyEnum>()"></select>
পাস্কাল আর।

হ্যাঁ, আইডি বলুন ট্যাগ
হেল্পাররা

এছাড়াও আপনি এটি @ এইচটিএমএল.ড্রপডাউনলিস্টফোর্ড (x => x.Foo, HTML.GetEnumSelectList (টাইপফ (FooEnum))) করতে পারেন
ফ্রেইডুন বারিকজেহে

6

এখন এই বৈশিষ্ট্যটি এমভিসি 5.1 এর মাধ্যমে বাইরের বাইরে সমর্থনযোগ্য @Html.EnumDropDownListFor()

নিম্নলিখিত লিঙ্কটি পরীক্ষা করুন:

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

এটা সত্যিই লজ্জাজনক যে মাইক্রোসফ্টকে এমন বৈশিষ্ট্য প্রয়োগ করতে 5 বছর সময় লেগেছে যা উপরের ভোটদান অনুসারে এতটাই চাহিদা!


5

সাইমন এর উত্তরের ভিত্তিতে, এনামের মধ্যে বর্ণন বৈশিষ্ট্যের পরিবর্তে এনাম মানগুলি একটি রিসোর্স ফাইল থেকে প্রদর্শন করার জন্য অনুরূপ পন্থা। এটি যদি আপনার সাইটের একাধিক ভাষায় রেন্ডার করা প্রয়োজন হয় এবং এনুমসের জন্য আপনার যদি কোনও নির্দিষ্ট সংস্থান ফাইল থাকে তবে আপনি আপনার এনুমে আরও একধাপ এগিয়ে যেতে পারেন এবং কেবল এনামের মান রাখতে পারেন এবং দ্বারা এক্সটেনশন থেকে রেফারেন্সটি উল্লেখ করতে পারেন একটি কনভেনশন যেমন [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();
}

এনামস.আরেক্স ফাইলের সংস্থানগুলি আইটেম টাইপ_মোভি: ফিল্মের মতো দেখাচ্ছে

অন্য একটি জিনিস আমি করতে চাই তা হ'ল সরাসরি এক্সটেনশান পদ্ধতিটি কল করার পরিবর্তে আমি এটি একটি @ এইচটিএমএল.এডিটরফর (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. এটি নিশ্চিত করে (জেনেরিক ধরণের প্রতিবন্ধকতা সহ) মানটি সত্যই একটি এনাম মান (আন-সংযুক্ত মেলোডির কারণে)
  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() });
        }
    }

এখন আপনার মডেলটিতে সিলেক্টলিস্ট আইটেমের তালিকা প্রকাশিত হয়েছে, আপনি এই সম্পত্তিটিকে উত্স হিসাবে ব্যবহার করতে @ এইচটিএমএল.ড্রপডাউনলিস্ট বা @ এইচটিএমএল.ড্রপডাউনলিস্ট ব্যবহার করতে পারেন।


জন স্কিটের কোড ব্যবহার করার জন্য +1 :), যদিও
মজার

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

আপনি গ্রিফিন.এমভিসিকন্ট্রিবিতে আমার কাস্টম এইচটিএমএল সহায়তাও ব্যবহার করতে পারেন। নিম্নলিখিত কোড:

@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
@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" }

})

আমি মনে করি এটি কোনও বৈধ উত্তর নয়, এটি ড্রপডাউনটি জনসাধারণের জন্য এনাম ব্যবহার করছে না।
অ্যান্ড্রু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.