ASP.NET MVC Core의 드롭 다운 목록에 열거 형 사용


84

Razor보기에서 태그 도우미를 사용하여 ASP.NET MVC Core에서 열거 형 속성이있는 드롭 다운 목록을 만들려고합니다.

모델은 다음과 같습니다.

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

답변:


123

GenderType대신 실수로 사용했다고 생각합니다 Gender. 올바른 구문은 다음과 같습니다.

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

11
이것이 답이어야합니다. 최신 태그 도우미를 사용하고 목록 항목을 빌드하기 위해 GetEnumSelectList <Enum> ()을 구현하는 방법을 보여줍니다.
Bryan Halterman

.NET 핵심 덕분에 나를 위해 일한 먼저 제안
rogue39nin

67

GenderTypeEnum 유형이 아니라 속성 이름입니다. GetEnumSelectList 메서드는 모델의 속성 이름이 아니라 열거 형 유형을 제공 할 것으로 예상합니다.

이 시도:

Html.GetEnumSelectList<Gender>()

다음과 같이 asp-for에서 메타 데이터로 표시해야 할 수도 있습니다. Html.GetEnumSelectList <GenderType.Meta.Gender> () .. OP는 사용 된 MVC 프레임 워크 버전을 표시하지 않았습니다.
Mikael Puusaari

내가 해봤 Html.GetEnumSelectList <성> ()와 Html.GetEnumSelectList <열거 성> () - 그들이 오류와 같은 최대 두 쇼
데이비드 샤프

1
위의 예를 사용할 때 어떤 오류가 발생합니까? 같은 거요? 두 번째 예제가 유효한 구문이라고 생각하지 않습니다
ADyson

8
면도기에서는 ()로 둘러싸 야합니다. @ (Html.GetEnumSelectList <Gender> ()); 때문에 면도기 해석 <> html 태그 그렇지 않으면로
dyesdyes

@ADyson이 제발 볼 수 있습니까? stackoverflow.com/questions/48094102/…

26

Razor 구문을 사용하면됩니다.

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

1
이것이 바로 우리에게 필요한 것입니다!
juFo

7

나는 같은 문제가 생겼고 해결책을 찾기 위해 머리를 태웠다!

이 상황을 해결할 수 있으며 다음과 같이 뷰 위에 모델을 인스턴스화 할 수 있습니다.

@using CRM.Model;

@ YourSolution.Model 사용

예, 너무 이상하게 들리지만 나를 믿으십시오. 내 게시물에서 내 답변을 참조하십시오.

ASP.NET Core MVC에서 ENUM 태그 도우미 선택


6

아래는 나를 위해 일한 것입니다. 이것은 enum 자체가 모델로 사용중인 클래스의 범위에서 선언 된 클래스이기 때문에 필요하며 그 방법입니다.

<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

GenderType 대신 Gender to asp-items = "Html.GetEnumSelectList -GenderType- ()"을 사용합니다.

asp-items = "Html.GetEnumSelectList -Gender- ()"와 같은


1

DropDownList에 선택된 옵션이있을 때 케이스 편집을위한 케이스가 하나 필요합니다.

ASP.NET 5 (MVC 6)에서 열거 형 사용 TagHelper 선택

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);
            }
        }
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.