ASP.NET MVC कोर में ड्रॉपडाउन सूची के लिए एनम का उपयोग करना


83

मैं ASP.NET MVC कोर में एक enum प्रॉपर्टी के साथ एक ड्रॉपडाउन लिस्ट बनाने की कोशिश कर रहा हूँ, जिसमें रेजर व्यू में टैग हेल्पर का उपयोग किया गया है:

यहाँ मॉडल है:

public class PersonalMember : Member
{
    [Required, Display(Name = "First Name")]
    public string FirstName { get; set; }

    [Required, Display(Name = "Last Name")]
    public string LastName { get; set; }

    [EnumDataType(typeof(Gender))]
    public Gender GenderType { get; set; }
}

public enum Gender
{
    Male = 1,
    Female = 2
}

यहाँ दृश्य में एक रूप का हिस्सा है:

<div class="form-group">
    <label asp-for="GenderType" class="col-md-2 control-label"></label>
    <div class="col-md-10">
        <select asp-for="GenderType" asp-items="Html.GetEnumSelectList<GenderType>()">
            <option selected="selected" value="">Please select</option>
        </select>
        <span asp-validation-for="GenderType" class="text-danger" />
    </div>
</div>

मेरे पास जो समस्या है Html.GetEnumSelectList, GenderTypeवह यह है कि पहचाना नहीं जाता है और एक त्रुटि के रूप में दिखाई देता है।

क्या किसी को पता है यह कैसे हल करना है?


2
इसे निर्दिष्ट करने का प्रयास करें ... @ (Html.GetEnumSelectList <GenderType> ()) "
KD

जवाबों:


122

मुझे लगता है कि आप के GenderTypeबजाय गलती से इस्तेमाल किया Gender। सही सिंटैक्स है

<select asp-for="GenderType" asp-items="Html.GetEnumSelectList<Gender>()">
    <option selected="selected" value="">Please select</option>
</select>

11
यह उत्तर होना चाहिए, यह आधुनिक टैग सहायकों का उपयोग करता है और आपको दिखाता है कि सूची आइटम के निर्माण के लिए GetEnumSelectList <Enum> () को कैसे लागू किया जाए।
ब्रायन हाल्टरमैन

पहला सुझाव जो मेरे लिए काम करता है। नेट कोर धन्यवाद
rogue39nin

67

GenderTypeआपकी संपत्ति का नाम है, Enum प्रकार का नहीं। GetEnumSelectList पद्धति आपको यह उम्मीद करती है कि वह आपके मॉडल में संपत्ति का नाम नहीं, एन्यूमरेशन का प्रकार देगा।

इसे इस्तेमाल करे:

Html.GetEnumSelectList<Gender>()

इसे एस्प-के लिए मेटाडेटा के रूप में चिह्नित करने की आवश्यकता हो सकती है जैसे: Html.GetEnumSelectList <GenderType.Meta.Gender> () .. MVC फ्रेमवर्क के किस संस्करण का उपयोग किया गया है
Mikael Puusaari

मैंने Html.GetEnumSelectList <लिंग> () और Html.GetEnumSelectList <enum लिंग> () की कोशिश की है - वे दोनों त्रुटियों के रूप में दिखाई देते हैं
डेविड शार्प

1
ऊपर मेरे उदाहरण का उपयोग करने पर आपको क्या त्रुटि मिलती है? वही एक? मुझे नहीं लगता कि आपका दूसरा उदाहरण वैध वाक्य रचना है
एडीसन

8
रेजर में, आपको (): @ (Html.GetEnumSelectList <लिंग> ()) को घेरना होगा; क्योंकि रेजर की व्याख्या <> html टैग के रूप में अन्यथा की जाती है
dyesdyes

@ADyson क्या आप इसे देख सकते हैं? stackoverflow.com/questions/48094102/…

26

आप बस रेजर सिंटैक्स का उपयोग कर सकते हैं:

@Html.DropDownList("StudentGender", 
    Html.GetEnumSelectList<Gender>(),
    "Select Gender",new { @class = "form-control" })

1
यह वास्तव में हमें क्या चाहिए!
रसोइए

7

मैं एक ही समस्या है, मैं एक समाधान की तलाश में मेरे सिर को जला दिया!

आप इस स्थिति को हल कर सकते हैं, अपने विचार के शीर्ष पर आपको मॉडल को तत्काल बनाना जैसे:

@using CRM.Model;

@ यूजिंग योरसेशन ।मॉडल

हाँ, यह बहुत अजीब लगता है लेकिन मुझे विश्वास है, यह काम करता है! मेरा जवाब मेरी अपनी पोस्ट पर देखें।

ASP.NET Core MVC में ENUM टैग हेल्पर का चयन करें


6

नीचे मेरे लिए क्या काम किया गया था। यह आवश्यक है और जिस तरह से यह है क्योंकि एनम खुद एक वर्ग के दायरे के तहत घोषित एक वर्ग है जिसे आप एक मॉडल के रूप में उपयोग कर रहे हैं।

<select asp-for="Status" class="form-control" asp-items="@Html.GetEnumSelectList<Cart.CartStatus>()"></select>

संदर्भ के लिए मेरे मॉडल (प्रगति में काम) के नीचे

 public class Cart
    {
        public int CartId { get; set; }
        public List<Order> Orders { get; set; }
        [Required]
        public string UserId { get; set; }
        public DateTime DeliveryDate { get; set; }
        public CartStatus Status { get; set; }
        public enum CartStatus
        {
            Open = 1,
            Confirmed = 2,
            Shipped = 3,
            Received = 4
        }
    }

2

आप Gender का उपयोग asp-items = "Html.GetEnumSelectList -GenderType- ()" के बजाय GenderType से करते हैं

जैसे एस्प-आइटम = "Html.GetEnumSelectList -Gender- ()"


1

ड्रॉपडाउनलिस्ट में चयनित विकल्प होने पर एडिटिंग केस के लिए एक केस की जरूरत होती है

ASP.NET 5 (MVC 6) के साथ एनम का उपयोग करके टैग हेल्पर का चयन करें

public enum Gender {
  [Display(Name = "Male")]Male = 1,
  [Display(Name = "Female N")]Female = 2,
  [Display(Name = "Other")]Other = 3 
}

** संपादन मामले के लिए:

@Html.DropDownListFor(m => m, Html.GetEnumSelectList(typeof(Gender)))
@Html.DropDownListFor(m => m.Gender, Html.GetEnumSelectList<Gender>()))

@Html.DropDownListFor(m => m.Gender, Html.GetEnumSelectList<Gender>(), "Select", new { @class = "form-control" })

** मामले के लिए:

<select asp-for="Gender" asp-items="@Html.GetEnumSelectList<Gender>()">
   <option selected="selected" value="">Please select</option>
</select>

<select asp-for="Gender" asp-items="ViewBag.Genders"></select>

@Html.DropDownList("Gender", Html.GetEnumSelectList<Gender>(), "Select", new { @class = "form-control" })

0

यह netcore 3 में enum के साथ Custom TagHelper DropDownList को लागू करने का तरीका है

 <radio-button-enum asp-for="@Model.Status" value="@Model.Status"></radio-button-enum>


/// <summary>
/// <see cref="ITagHelper"/> implementation targeting &lt;enum-radio-button&gt; elements with an <c>asp-for</c> attribute, <c>value</c> attribute.
/// </summary>
[HtmlTargetElement("radio-button-enum", Attributes = RadioButtonEnumForAttributeName)]
public class RadioButtonEnumTagHelper : TagHelper
{
    private const string RadioButtonEnumForAttributeName = "asp-for";
    private const string RadioButtonEnumValueAttributeName = "value";

    /// <summary>
    /// Creates a new <see cref="RadioButtonEnumTagHelper"/>.
    /// </summary>
    /// <param name="generator">The <see cref="IHtmlGenerator"/>.</param>
    public RadioButtonEnumTagHelper(IHtmlGenerator generator)
    {
        Generator = generator;
    }

    /// <inheritdoc />
    public override int Order => -1000;

    [HtmlAttributeNotBound]
    [ViewContext]
    public ViewContext ViewContext { get; set; }

    protected IHtmlGenerator Generator { get; }

    /// <summary>
    /// An expression to be evaluated against the current model.
    /// </summary>
    [HtmlAttributeName(RadioButtonEnumForAttributeName)]
    public ModelExpression For { get; set; }

    [HtmlAttributeName(RadioButtonEnumValueAttributeName)]
    public Enum Value { get; set; }

    /// <inheritdoc />
    /// <remarks>Does nothing if <see cref="For"/> is <c>null</c>.</remarks>
    public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
    {
        if (context == null)
        {
            throw new ArgumentNullException(nameof(context));
        }

        if (output == null)
        {
            throw new ArgumentNullException(nameof(output));
        }

        var childContent = await output.GetChildContentAsync().ConfigureAwait(true);
        string innerContent = childContent.GetContent();
        output.Content.AppendHtml(innerContent);

        output.TagName = "div";
        output.TagMode = TagMode.StartTagAndEndTag;
        output.Attributes.Add("class", "btn-group btn-group-radio");
        
        var modelExplorer = For?.ModelExplorer;
        var metaData = For?.Metadata;

        if (metaData?.EnumNamesAndValues != null)
        {
            foreach (var item in metaData.EnumNamesAndValues)
            {
                string enumId = $"{metaData.ContainerType.Name}_{metaData.PropertyName}_{item.Key}";
                string enumInputLabelName = item.Key.ToString();

                bool enumIsChecked = false;
                if (Value != null)
                {
                    if (enumInputLabelName == Value.ToString())
                    {
                        enumIsChecked = true; }
                }
                else
                {
                    if (For.Model != null && enumInputLabelName == For.Model.ToString())
                    {
                        enumIsChecked = true;
                    }
                }

                var enumResourcedName = metaData.EnumGroupedDisplayNamesAndValues.FirstOrDefault(x => x.Value == item.Value);
                if (enumResourcedName.Value != null)
                {
                    enumInputLabelName = enumResourcedName.Key.Name;
                }

                var enumRadio = Generator.GenerateRadioButton(
                    ViewContext,
                    For.ModelExplorer,
                    metaData.PropertyName,
                    item.Key,
                    false,
                    htmlAttributes: new { @id = enumId });
                enumRadio.Attributes.Remove("checked");
                if (enumIsChecked)
                {
                    enumRadio.MergeAttribute("checked", "checked");
                }
                output.Content.AppendHtml(enumRadio);

                var enumLabel = Generator.GenerateLabel(
                    ViewContext,
                    For.ModelExplorer,
                    For.Name,
                    enumInputLabelName,
                    htmlAttributes: new { @for = enumId, @Class = "btn btn-default" });
                output.Content.AppendHtml(enumLabel);
            }
        }
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.