এমভিসি 3 রেজার ড্রপডাউনলিস্ট ফর এনামস


84

আমার প্রকল্পটি এমভিসি 3 তে আপডেট করার চেষ্টা করছে, এমন কিছু যা আমি সন্ধান করতে পারি না:

আমার ENUMS এর একটি সাধারণ ডেটাটাইপ রয়েছে:

public enum States()
{
  AL,AK,AZ,...WY
}

যা আমি এই ডেটাটাইপযুক্ত এমন কোনও মডেল হিসাবে আমার দৃষ্টিভঙ্গিতে ড্রপডাউন / সিলেক্টলিস্ট হিসাবে ব্যবহার করতে চাই:

public class FormModel()
{
    public States State {get; set;}
}

খুব সোজা এগিয়ে: যখন আমি এই আংশিক শ্রেণীর জন্য স্বয়ংক্রিয় উত্পন্ন দৃশ্যের ব্যবহার করতে যাই, তখন এটি এই ধরণের উপেক্ষা করে।

আমার একটি সহজ নির্বাচনী তালিকা দরকার যা আমি যখন আমার এজেএক্স - জেএসন পোস্ট পদ্ধতিটির মাধ্যমে জমা দিতে এবং প্রক্রিয়া করি তখন নির্বাচিত আইটেম হিসাবে এনামের মান সেট করে।

এবং দেখার চেয়েও (???!):

    <div class="editor-field">
        @Html.DropDownListFor(model => model.State, model => model.States)
    </div>

উপদেশের জন্য অগ্রিম ধন্যবাদ!


8
যে কেউ এই থ্রেডটি জুড়ে আসে এবং এমভিসি 5.1 বা তদুর্ধের ব্যবহার করে, হেল্পার পদ্ধতি @ এইচটিএমএল.ইনামড্রপডাউনলিস্টফোর্ড (এখন) এমভিসিতে নির্মিত হয়েছে
এএসপিএন /

উত্তর:


55

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

public static class SelectExtensions
{

    public static string GetInputName<TModel, TProperty>(Expression<Func<TModel, TProperty>> expression)
    {
        if (expression.Body.NodeType == ExpressionType.Call)
        {
            MethodCallExpression methodCallExpression = (MethodCallExpression)expression.Body;
            string name = GetInputName(methodCallExpression);
            return name.Substring(expression.Parameters[0].Name.Length + 1);

        }
        return expression.Body.ToString().Substring(expression.Parameters[0].Name.Length + 1);
    }

    private static string GetInputName(MethodCallExpression expression)
    {
        // p => p.Foo.Bar().Baz.ToString() => p.Foo OR throw...
        MethodCallExpression methodCallExpression = expression.Object as MethodCallExpression;
        if (methodCallExpression != null)
        {
            return GetInputName(methodCallExpression);
        }
        return expression.Object.ToString();
    }

    public static MvcHtmlString EnumDropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) where TModel : class
    {
        string inputName = GetInputName(expression);
        var value = htmlHelper.ViewData.Model == null
            ? default(TProperty)
            : expression.Compile()(htmlHelper.ViewData.Model);

        return htmlHelper.DropDownList(inputName, ToSelectList(typeof(TProperty), value.ToString()));
    }

    public static SelectList ToSelectList(Type enumType, string selectedItem)
    {
        List<SelectListItem> items = new List<SelectListItem>();
        foreach (var item in Enum.GetValues(enumType))
        {
            FieldInfo fi = enumType.GetField(item.ToString());
            var attribute = fi.GetCustomAttributes(typeof(DescriptionAttribute), true).FirstOrDefault();
            var title = attribute == null ? item.ToString() : ((DescriptionAttribute)attribute).Description;
            var listItem = new SelectListItem
                {
                    Value = ((int)item).ToString(),
                    Text = title,
                    Selected = selectedItem == ((int)item).ToString()
                };
            items.Add(listItem);
        }

        return new SelectList(items, "Value", "Text", selectedItem);
    }
}

এটি হিসাবে ব্যবহার করুন:

Html.EnumDropDownListFor(m => m.YourEnum);

হালনাগাদ

আমি বিকল্প এইচটিএমএল সহায়ক তৈরি করেছি। সমস্ত তাদের ব্যবহার করার জন্য যা করতে হবে আপনার baseviewpage পরিবর্তন হয় views\web.config

তাদের সাথে আপনি কেবল করতে পারেন:

@Html2.DropDownFor(m => m.YourEnum);
@Html2.CheckboxesFor(m => m.YourEnum);
@Html2.RadioButtonsFor(m => m.YourEnum);

এখানে আরও তথ্য: http://blog.gauffin.org/2011/10/first-draft-of-my-al متبادل-html-helpers/


4
ঠিক আছে, এটি কোনওভাবেই কাজ করে, আমি কেবল একটি সংকলনের ত্রুটি পেয়েছি: লাইন 41: htmlHelper.DropDownList (ইনপুটনাম, টোসিলিটলিস্ট (টাইপফ (টিপ্রোপার্টি), মান.টোস্ট্রিং ())) রিটার্ন করুন; 'System.Web.Mvc.HtmlHelper <TModel>' তে 'ড্রপডাউনলিস্ট' এর সংজ্ঞা নেই এবং কোনও এক্সটেনশন পদ্ধতি 'ড্রপডাউনলিস্ট' 'সিস্টেম.ওয়েব.এমভিসি.এইচটিএমএল হেল্পার <টিমোডেল>' টাইপের প্রথম আর্গুমেন্ট গ্রহণ করা যায়নি ( আপনি কি কোনও ব্যবহার নির্দেশনা বা বিধানসভা রেফারেন্স মিস করছেন?)
jordan.bauaker

4
@ জোর্ডান আমারও একই ত্রুটি রয়েছে। আপনি কি সমস্যা সমাধানের ব্যবস্থা করেছেন?
এসএফ বিকাশকারী

9
@ ফিলু @ জর্দান using System.Web.Mvc.Html;আপনার প্রবেশাধিকার হিসাবে যুক্ত করুনSelectExtensionsClass
সাইমন হার্টচার

4
@ পারা আমি একই সমস্যা পেয়েছি, নির্বাচিত মানটি ভিউতে নির্বাচিত প্রদর্শিত হয় না। ( নির্বাচিত হিসাবে সঠিকভাবে সংরক্ষণ করার ((int)item).ToString()জন্য আমাকে পরিবর্তন Enum.GetName(enumType, item)করতে SelectListItemহয়েছিল, তবে এটি এখনও কার্যকর হয় না)
ফার্নান্দো নীরা

4
কেবল নীচে একটি উত্তর যুক্ত করা হয়েছে যা নির্বাচন ইস্যুটির জন্য রয়েছে - ড্রপডাউনলিস্ট ওভারলোডগুলির আচরণের ভুল বোঝাবুঝি থেকে উদ্ভূত।
জন এগারটন

199

আমি এর জন্য এখানে একটি সহজ সরল সমাধান খুঁজে পেয়েছি: http://coding-in.net/asp-net-mvc-3-thod-extension/

using System;
using System.Linq.Expressions;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Html;

namespace EnumHtmlHelper.Helper
{    
    public static class EnumDropDownList
    {
        public static HtmlString EnumDropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> modelExpression, string firstElement)
        {
            var typeOfProperty = modelExpression.ReturnType;
            if(!typeOfProperty.IsEnum)
                throw new ArgumentException(string.Format("Type {0} is not an enum", typeOfProperty));     
            var enumValues = new SelectList(Enum.GetValues(typeOfProperty));
            return htmlHelper.DropDownListFor(modelExpression, enumValues, firstElement);
}   }   }

রেজারে একটি লাইন এটি করবে:

@Html.DropDownListFor(model => model.State, new SelectList(Enum.GetValues(typeof(MyNamespace.Enums.States))))

আপনি লিঙ্কযুক্ত নিবন্ধে একটি এক্সটেনশন পদ্ধতিতে এটি করার জন্য কোডও সন্ধান করতে পারেন।


6
আমি মনে করি এটি সমাধান হিসাবে চিহ্নিত করা উচিত ছিল। সেরা জটিলতায় নয় সরলতার দ্বারা চিহ্নিত করা হয়েছে।
স্ক্রিপ্টগুলির লর্ড

4
যারা ড্রপডাউনলিস্ট সংস্করণটি দেখতে পান (আমার মতো): @ এইচটিএমএল.ড্রপডাউনলিস্ট ("listName", নতুন নির্বাচন তালিকা (Enum.GetValues ​​(টাইপফ (MyNamespace.Enums.States)))))
ডিসি

4
@ জোনএগারটন যদি আপনি আমার মতোই বোঝেন তবে আমি সম্মত agree আপনি যদি enums + বিবরণ + একটি চিত্র প্রদর্শন করতে চান তবে আপনি মাইক ম্যাকলফলিনের সমাধানটি হারিয়েছেন।
এলিজাবেথ

4
এই সমাধানগুলির সাথে আমি একমাত্র সমস্যাটি খুঁজে পেয়েছি হ'ল নির্বাচিত মানটি লোড করার সময় এটি সঠিকভাবে মানচিত্র করে না। একপাশে, বেশ ভাল।
ত্রিভুলিটো

4
@ ত্রিআঙ্গুলিটো এটি মোটেও সমস্যা নয় :)@Html.DropDownListFor(model => model.State, new SelectList(Enum.GetValues(typeof(MyNamespace.Enums.States)),model.State))
ভ্ল্যাডএল


17

আপনি যদি সত্যিই সাধারণ কিছু চান তবে অন্য উপায় আছে, এটি কীভাবে আপনি ডাটাবেজে রাজ্যটি সঞ্চয় করেন তার উপর নির্ভর করে।

আপনার যদি এর মতো সত্ত্বা থাকে:

public class Address
{
     //other address fields

     //this is what the state gets stored as in the db
     public byte StateCode { get; set; }

     //this maps our db field to an enum
     public States State
     {
         get
         {
             return (States)StateCode;
         }
         set
         {
             StateCode = (byte)value;
         }
     }
}

তারপরে ড্রপডাউন উত্পন্ন করা এত সহজ হবে:

@Html.DropDownListFor(x => x.StateCode,
    from State state in Enum.GetValues(typeof(States))
    select new SelectListItem() { Text = state.ToString(), Value = ((int)state).ToString() }
);

লিনকিউ সুন্দর না?


মডেল বা ভিউতে আপনি রাষ্ট্রসমূহকে কোথায় সংজ্ঞায়িত করবেন?
অধিপতি

মডেলটিতে যেমন এটি মডেল শ্রেণি দ্বারা ব্যবহৃত হয়
sjmeverett

4
@ স্টিওয়ার্টএমএল যখন আমার ভিউমোডেলের এনাম সম্পত্তি + "নির্বাচিত কোড কোড" থাকে তখন আপনার পোস্টে এটি একটি সম্পত্তি much আইটেমের মান হিসাবে সার্ভার + এ আবার নির্বাচন করা মান পোস্ট হিসাবে এনাম কেন নেই।
এলিজাবেথ

13

আমি এক লাইনে এটি করতে সক্ষম হয়েছি।

@Html.DropDownListFor(m=>m.YourModelProperty,new SelectList(Enum.GetValues(typeof(YourEnumType))))

8

@ জাগাফিনের গৃহীত উত্তরের ভিত্তিতে, আমি আমার নিজস্ব সংস্করণ তৈরি করেছি EnumDropDownListFor, যা আইটেম নির্বাচন করার সমস্যা নিয়ে কাজ করে।

সমস্যাটি এখানে অন্য এসও উত্তরে বিশদভাবে দেওয়া হয়েছে : এবং মূলত এর বিভিন্ন ওভারলোডের আচরণের একটি ভুল বোঝাবুঝির নিচে রয়েছে DropDownList

আমার পূর্ণ কোড (যার মধ্যে ওভারলোডগুলি htmlAttributesইত্যাদি রয়েছে):

public static class EnumDropDownListForHelper
{

    public static MvcHtmlString EnumDropDownListFor<TModel, TProperty>(
            this HtmlHelper<TModel> htmlHelper, 
            Expression<Func<TModel, TProperty>> expression
        ) where TModel : class
    {
        return EnumDropDownListFor<TModel, TProperty>(
                            htmlHelper, expression, null, null);
    }

    public static MvcHtmlString EnumDropDownListFor<TModel, TProperty>(
            this HtmlHelper<TModel> htmlHelper, 
            Expression<Func<TModel, TProperty>> expression, 
            object htmlAttributes
        ) where TModel : class
    {
        return EnumDropDownListFor<TModel, TProperty>(
                            htmlHelper, expression, null, htmlAttributes);
    }

    public static MvcHtmlString EnumDropDownListFor<TModel, TProperty>(
            this HtmlHelper<TModel> htmlHelper, 
            Expression<Func<TModel, TProperty>> expression, 
            IDictionary<string, object> htmlAttributes
        ) where TModel : class
    {
        return EnumDropDownListFor<TModel, TProperty>(
                            htmlHelper, expression, null, htmlAttributes);
    }

    public static MvcHtmlString EnumDropDownListFor<TModel, TProperty>(
            this HtmlHelper<TModel> htmlHelper, 
            Expression<Func<TModel, TProperty>> expression, 
            string optionLabel
        ) where TModel : class
    {
        return EnumDropDownListFor<TModel, TProperty>(
                            htmlHelper, expression, optionLabel, null);
    }

    public static MvcHtmlString EnumDropDownListFor<TModel, TProperty>(
            this HtmlHelper<TModel> htmlHelper, 
            Expression<Func<TModel, TProperty>> expression, 
            string optionLabel, 
            IDictionary<string,object> htmlAttributes
        ) where TModel : class
    {
        string inputName = GetInputName(expression);
        return htmlHelper.DropDownList(
                            inputName, ToSelectList(typeof(TProperty)), 
                            optionLabel, htmlAttributes);
    }

    public static MvcHtmlString EnumDropDownListFor<TModel, TProperty>(
            this HtmlHelper<TModel> htmlHelper, 
            Expression<Func<TModel, TProperty>> expression, 
            string optionLabel, 
            object htmlAttributes
        ) where TModel : class
    {
        string inputName = GetInputName(expression);
        return htmlHelper.DropDownList(
                            inputName, ToSelectList(typeof(TProperty)), 
                            optionLabel, htmlAttributes);
    }


    private static string GetInputName<TModel, TProperty>(
            Expression<Func<TModel, TProperty>> expression)
    {
        if (expression.Body.NodeType == ExpressionType.Call)
        {
            MethodCallExpression methodCallExpression 
                            = (MethodCallExpression)expression.Body;
            string name = GetInputName(methodCallExpression);
            return name.Substring(expression.Parameters[0].Name.Length + 1);

        }
        return expression.Body.ToString()
                    .Substring(expression.Parameters[0].Name.Length + 1);
    }

    private static string GetInputName(MethodCallExpression expression)
    {
        // p => p.Foo.Bar().Baz.ToString() => p.Foo OR throw...
        MethodCallExpression methodCallExpression 
                            = expression.Object as MethodCallExpression;
        if (methodCallExpression != null)
        {
            return GetInputName(methodCallExpression);
        }
        return expression.Object.ToString();
    }


    private static SelectList ToSelectList(Type enumType)
    {
        List<SelectListItem> items = new List<SelectListItem>();
        foreach (var item in Enum.GetValues(enumType))
        {
            FieldInfo fi = enumType.GetField(item.ToString());
            var attribute = fi.GetCustomAttributes(
                                       typeof(DescriptionAttribute), true)
                                  .FirstOrDefault();
            var title = attribute == null ? item.ToString() 
                              : ((DescriptionAttribute)attribute).Description;
            var listItem = new SelectListItem
            {
                Value = item.ToString(),
                Text = title,
            };
            items.Add(listItem);
        }

        return new SelectList(items, "Value", "Text");
    }
}

আমি আমার ব্লগে এটি লিখেছি ।


4
এটিই আমার একমাত্র সমাধান যা আমার গণনার জন্য প্রাসঙ্গিকভাবে সঠিকভাবে নির্বাচন করে across ধন্যবাদ!
এডউইন গ্রোয়েনডাল

অসাধারণ. এটি অবশ্যই গ্রহণযোগ্য উত্তর হওয়া উচিত - এটি কাজ করে; গৃহীত উত্তর দেয় না।
নিমিনেম

3

এটি এনাম থেকে কোন মান নির্বাচন করতে সহায়ক হবে: এখানে SpecTypeএকটি intক্ষেত্র ... এবং enmSpecTypeএটি একটি enum

@Html.DropDownList(
    "SpecType", 
     YourNameSpace.SelectExtensions.ToSelectList(typeof(NREticaret.Core.Enums.enmSpecType), 
     Model.SpecType.ToString()), "Tip Seçiniz", new 
     { 
         gtbfieldid = "33", 
         @class = "small" 
     })

3

এটি আমার জন্য আরও ভালভাবে কাজ করার জন্য আমি সিলেকলিস্ট পদ্ধতিতে নিম্নলিখিত পরিবর্তনগুলি করেছি। হতে পারে এটি অন্যের জন্য কার্যকর হবে।

public static SelectList ToSelectList<T>(T selectedItem)
        {
            if (!typeof(T).IsEnum) throw new InvalidEnumArgumentException("The specified type is not an enum");

            var selectedItemName = Enum.GetName(typeof (T), selectedItem);
            var items = new List<SelectListItem>();
            foreach (var item in Enum.GetValues(typeof(T)))
            {
                var fi = typeof(T).GetField(item.ToString());
                var attribute = fi.GetCustomAttributes(typeof(DescriptionAttribute), true).FirstOrDefault();

                var enumName = Enum.GetName(typeof (T), item);
                var title = attribute == null ? enumName : ((DescriptionAttribute)attribute).Description;

                var listItem = new SelectListItem
                {
                    Value = enumName,
                    Text = title,
                    Selected = selectedItemName == enumName
                };
                items.Add(listItem);
            }

            return new SelectList(items, "Value", "Text");
        }

3
    public enum EnumStates
    {
        AL = 0,
        AK = 1,
        AZ = 2,
        WY = 3
    }


@Html.DropDownListFor(model => model.State, (from EnumStates e in Enum.GetValues(typeof(EnumStates))
                                                               select new SelectListItem { Value = ((int)e).ToString(), Text = e.ToString() }), "select", new { @style = "" })
                @Html.ValidationMessageFor(model => model.State)  //With select



//Or


@Html.DropDownListFor(model => model.State, (from EnumStates e in Enum.GetValues(typeof(EnumStates))
                                                               select new SelectListItem { Value = ((int)e).ToString(), Text = e.ToString() }), null, new { @style = "" })
                @Html.ValidationMessageFor(model => model.State)   //With out select

আপনি কোথায় এনামস্টেট সংজ্ঞায়িত করবেন?
অধিপতি

শীর্ষে আপনি এটি দেখতে পাচ্ছেন ... সর্বজনীন এনামস্টেটস
Thulasiram

2

মাইকের মতো (যা দীর্ঘ প্রতিক্রিয়ার মধ্যে সমাধিস্থ)

মডেল.টাকিমাগলোকেশন হ'ল ট্রাকআইমেজলোকেশন গণনার প্রকারের শ্রেণীর উদাহরণ

@Html.DropDownListFor(model=>model.truckimagelocation,Enum.GetNames(typeof(TruckImageLocation)).ToArray().Select(f=> new SelectListItem() {Text = f, Value = f, Selected = false}))

2

এটি সর্বাধিক জেনেরিক কোড যা সমস্ত এনামের জন্য ব্যবহৃত হবে।

public static class UtilitiesClass
{

    public static SelectList GetEnumType(Type enumType)
    {
        var value = from e in Enum.GetNames(enumType)
                    select new
                    {
                        ID = Convert.ToInt32(Enum.Parse(enumType, e, true)),
                        Name = e
                    };
        return new SelectList(value, "ID", "Name");
    }
}

ক্রিয়া পদ্ধতি

ViewBag.Enum= UtilitiesClass.GetEnumType(typeof (YourEnumType));

View.cshtml

 @Html.DropDownList("Type", (IEnumerable<SelectListItem>)ViewBag.Enum, new { @class = "form-control"})

1

আপনি আপনার মডেল মধ্যে এনাম ব্যবহার করতে পারেন

তোমার এনাম

public enum States()
{
  AL,AK,AZ,...WY
}

একটি মডেল তৈরি করুন

public class enumclass
{
public States statesprop {get; set;}
}

দেখুন

@Html.Dropdownlistfor(a=>a.statesprop)

সর্বশেষ প্রশ্নসমূহ উত্তর কর।
অনুপ

1

এমভিসি 5 এর সবচেয়ে সহজ উত্তর হ'ল ডিফাইন এনাম:

public enum ReorderLevels {
          zero = 0,
            five = 5,
            ten = 10,
            fifteen = 15,
            twenty = 20,
            twenty_five = 25,
            thirty = 30
        }

দৃশ্যে আবদ্ধ:

        <div class="form-group">
            <label>Reorder Level</label>
            @Html.EnumDropDownListFor(m => m.ReorderLevel, "Choose Me", new { @class = "form-control" })
        </div>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.