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
, GenderType
wird nicht als Fehler erkannt und zeigen nach oben.
Weiß jemand, wie man das löst?
c#
asp.net
asp.net-mvc
enums
asp.net-core-mvc
David Sharpe
quelle
quelle
Antworten:
Ich denke du hast versehentlich
GenderType
statt benutztGender
. Die richtige Syntax lautet<select asp-for="GenderType" asp-items="Html.GetEnumSelectList<Gender>()"> <option selected="selected" value="">Please select</option> </select>
quelle
GenderType
ist 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:
quelle
Sie können einfach die Razor-Syntax verwenden:
@Html.DropDownList("StudentGender", Html.GetEnumSelectList<Gender>(), "Select Gender",new { @class = "form-control" })
quelle
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 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
quelle
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 } }
quelle
Sie verwenden Gender für asp-items = "Html.GetEnumSelectList -GenderType- ()" anstelle von GenderType
wie asp-items = "Html.GetEnumSelectList -Gender- ()"
quelle
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" })
quelle
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 <enum-radio-button> 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); } } } }
quelle