Verwenden der Aufzählung für die Dropdown-Liste in ASP.NET MVC Core

79

Ich versuche, eine Dropdown-Liste mit einer enum-Eigenschaft in ASP.NET MVC Core mithilfe des Tag-Hilfsprogramms in einer Razor-Ansicht zu erstellen:

Hier ist das Modell:

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
}

Hier ist ein Teil eines Formulars in der Ansicht:

<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>

Das Problem , das ich habe , ist , dass nach Html.GetEnumSelectList, GenderTypewird nicht als Fehler erkannt und zeigen nach oben.

Weiß jemand, wie man das löst?

David Sharpe
quelle
2
versuchen Sie es wie ... @ (Html.GetEnumSelectList <GenderType> ()) "
KD

Antworten:

112

Ich denke du hast versehentlich GenderTypestatt benutzt Gender. Die richtige Syntax lautet

<select asp-for="GenderType" asp-items="Html.GetEnumSelectList<Gender>()">
    <option selected="selected" value="">Please select</option>
</select>
Kostas
quelle
8
Dies sollte die Antwort sein. Es verwendet die modernen Tag-Helfer UND zeigt Ihnen, wie Sie GetEnumSelectList <Enum> () implementieren, um das Listenelement zu erstellen.
Bryan Halterman
Erster Vorschlag, der für mich in .net Core
funktioniert hat
65

GenderTypeist Ihr Eigenschaftsname, nicht der Aufzählungstyp. Die GetEnumSelectList-Methode erwartet, dass Sie den Typ der Aufzählung angeben, nicht den Namen der Eigenschaft in Ihrem Modell.

Versuche dies:

Html.GetEnumSelectList<Gender>()
ADyson
quelle
Möglicherweise müssen Sie es im Asp-for wie folgt als Metadaten markieren: Html.GetEnumSelectList <GenderType.Meta.Gender> (). Das OP hat nicht markiert, welche Version des MVC-Frameworks verwendet wird
Mikael Puusaari
Ich habe Html.GetEnumSelectList <Gender> () und Html.GetEnumSelectList <enum Gender> () ausprobiert - beide werden als Fehler angezeigt
David Sharpe
1
Welchen Fehler erhalten Sie, wenn Sie mein Beispiel oben verwenden? Das gleiche? Ich glaube nicht, dass Ihr zweites Beispiel eine gültige Syntax ist
ADyson
8
In Rasiermesser müssen Sie von () umgeben: @ (Html.GetEnumSelectList <Gender> ()); Weil Rasiermesser das <> sonst als HTML-Tags interpretiert
dyesdyes
@ADyson könntest du das bitte sehen? stackoverflow.com/questions/48094102/…
25

Sie können einfach die Razor-Syntax verwenden:

@Html.DropDownList("StudentGender", 
    Html.GetEnumSelectList<Gender>(),
    "Select Gender",new { @class = "form-control" })
Faishal Ahammad
quelle
1
Das brauchen wir wirklich!
JuFo
7

Ich habe das gleiche Problem, ich habe mir den Kopf verbrannt und nach einer Lösung gesucht!

Sie können diese Situation lösen, indem Sie Ihr Modell wie folgt instanziieren:

@using CRM.Model;

@ using YourSolution.Model

Ja, es klingt zu seltsam, aber glauben Sie mir, es funktioniert! Siehe meine Antwort in meinem eigenen Beitrag.

Wählen Sie in ASP.NET Core MVC ENUM Tag Helper aus

Rogerio Azevedo
quelle
6

Das Folgende war das, was für mich funktioniert hat. Dies ist notwendig und so, weil die Aufzählung selbst eine Klasse ist, die im Rahmen der Klasse deklariert ist, die Sie als Modell verwenden.

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

unter meinem Modell (in Arbeit) als Referenz

 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
        }
    }
Daniel Paiva
quelle
2

Sie verwenden Gender für asp-items = "Html.GetEnumSelectList -GenderType- ()" anstelle von GenderType

wie asp-items = "Html.GetEnumSelectList -Gender- ()"

Mehdi
quelle
1

Es gibt einen Fall zum Bearbeiten des Falls, wenn in DropDownList die Option ausgewählt ist

Verwenden von Aufzählungen mit ASP.NET 5 (MVC 6) Wählen Sie TagHelper aus

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

** Zum Bearbeiten von Fällen:

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

** Für den Normalfall:

<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" })
Minh Nguyen Van
quelle
0

Auf diese Weise können Sie Custom TagHelper DropDownList mit enum in netcore 3 implementieren

 <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);
            }
        }
    }
}
Minh Nguyen Van
quelle