0

Razor ページ (ASP.NET Core) で列挙型の値を反復処理しているときに、列挙型の表示名を表示するにはどうすればよいですか?

かみそりのページ:

<label asp-for="Survey.ToldNotToTakeHormones"></label><br />
@foreach (var answer in Enum.GetValues(typeof(AnswerYND)))
{
    <div class="custom-control custom-radio custom-control-inline ">
        <label><input type="radio" asp-for="Survey.ToldNotToTakeHormones" value="@answer" />@answer</label>
    </div>
}

かみそりページの背後にあるコード:

public class EditModel : PageModel
{
    [BindProperty]
    public Survey Survey { get; set; }

調査クラス:

public class Survey
{
    [Display(Name = "Have you ever been told by a medical professional not to take hormones?")]
    public AnswerYND? ToldNotToTakeHormones { get; set; }

回答YND:

public enum AnswerYND
{ 
    Yes,
    No,
    [Display(Name="Don't Know")]
    DontKnow
}
4

2 に答える 2

0

そのため、表示名の代わりに説明を利用して、目的の効果を得ることができました。
次の拡張メソッドを作成する必要がありました。

public static class EnumHelper
{
    public static string GetDescription<T>(this T enumValue)
        where T : struct, IConvertible
    {
        if (!typeof(T).IsEnum)
            return null;

        var description = enumValue.ToString();
        var fieldInfo = enumValue.GetType().GetField(enumValue.ToString());

        if (fieldInfo != null)
        {
            var attrs = fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), true);
            if (attrs != null && attrs.Length > 0)
            {
                description = ((DescriptionAttribute)attrs[0]).Description;
            }
        }

        return description;
    }
}

そして、次の結果をキャストすることで、Razor ページの拡張メソッドにアクセスできましたEnum.GetValues(typeof(AnswerYND))

<label asp-for="Survey.CurrenltyUsingBirthControl"></label><br />
@foreach (var answer in Enum.GetValues(typeof(AnswerYND)).Cast<AnswerYND>())
{
    <div class="custom-control custom-radio custom-control-inline ">
    <label><input type="radio" asp-for="Survey.CurrenltyUsingBirthControl" value="@answer" />@answer.GetDescription()</label>
    </div>
 }
于 2021-01-31T03:44:43.770 に答える