Выберите HTML-помощник, чтобы получить метод расширения, а не строку enum - PullRequest
0 голосов
/ 14 мая 2019

Я создал расширение enum:

using System;
using System.ComponentModel;

namespace Shared.Enums.Extensions
{
    public static class EnumExtensions {

        // This extension method is broken out so you can use a similar pattern with 
        // other MetaData elements in the future. This is your base method for each.
        public static T GetAttribute<T>(this Enum value) where T : Attribute {
            var type = value.GetType();
            var memberInfo = type.GetMember(value.ToString());
            var attributes = memberInfo[0].GetCustomAttributes(typeof(T), false);
            return attributes.Length > 0 
                ? (T)attributes[0]
                : null;
        }

        // This method creates a specific call to the above method, requesting the
        // Description MetaData attribute.
        public static string ToName(this Enum value) {
            var attribute = value.GetAttribute<DescriptionAttribute>();
            return attribute == null ? value.ToString() : attribute.Description;
        }

    }
}

Это позволяет мне добавить атрибут к моим членам enum, чтобы я мог получить красиво отформатированную строку для представления emum пользователю, используя метод расширения ToName():

    public enum Rarity
    {
        [Description("One of a kind")]
        OneOfAKind,
        [Description("Rare Item")]
        RareItem
    }

// Then in my razor view

<dt>
    @Html.DisplayNameFor(model => model.Rarity)
</dt>
<dd>
    @Model.Rarity.ToName()
</dd>

Что прекрасно работает!

Так что я надеялся использовать это описание в выпадающем списке. Но, похоже, не могу найти способ сделать это в представлении Razor, используя HTML.Helpers. Куда бы я положил логику для вызова метода расширения ToName()?:

<div class="form-group">
    <label asp-for="Rarity" class="control-label"></label>
    <select asp-for="Rarity"
       asp-items="Html.GetEnumSelectList<Rarity>()" class="form-control"></select>
</div>

1 Ответ

1 голос
/ 14 мая 2019

Вы хотите использовать имя System.DataAnnotations.Display вместо описания.Согласно этому ответу: Html.GetEnumSelectList - Получение значений Enum с пробелами

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...