【问题标题】:How to get enum from model into view with displayfor如何使用 displayfor 从模型中获取枚举到视图中
【发布时间】:2026-02-03 13:35:01
【问题描述】:

我无法正确获取由模型中的枚举值填充的视图。

我尝试从这个线程中阅读以帮助我使用 htmlhelper,但没有占上风: How find the enum name for corresponding value and use it in DisplayFor?

public static class HtmlExtensions
{
    public static IHtmlString DisplayEnumFor<TModel>(this HtmlHelper<TModel> html, Expression<Func<TModel, int>> ex, Type enumType)
    {
        var value = (int)ModelMetadata.FromLambdaExpression(ex, html.ViewData).Model;
        string enumValue = Enum.GetName(enumType, value);
        return new HtmlString(html.Encode(enumValue));
    }
}

但是很可惜,它不起作用。我收到这条消息:

CS0266: Cannot implicitly convert type 'HiltiHaninge.Models.Discplines' to 'int'. An explicit conversion exists (are you missing a cast?)

我已尽最大努力尝试不将其设为 int,而是将其设为模型包含的该值的字符串表示形式。观点:

@model HiltiHaninge.Models.CellEntity
@using HiltiHaninge.Helpers

@{
ViewBag.Title = "Ta bort pass " + @Html.DisplayFor(model => model.Id) + ", på " + @Html.DisplayFor(model => model.Day);
}

<h2>@ViewBag.Title</h2>

<h3>Är du säker på att du vill radera inlägget?</h3>
<fieldset>
<legend>Pass @Html.DisplayFor(model => model.Id)</legend>

<div class="display-label">
    <p class="text_without_indent">Tid från: (TT-MM)</p>
</div>
<div class="display-field">
    @Html.DisplayFor(model => model.TimeFromHour)
    @Html.DisplayFor(model => model.TimeFromMinute)
</div>

<div class="display-label">
    <p class="text_without_indent">Tid till: (TT-MM)</p>
</div>
<div class="display-field">
    @Html.DisplayFor(model => model.TimeToHour)
    @Html.DisplayFor(model => model.TimeToMinute)
</div>

<div class="display-label">
     <p class="text_without_indent">@Html.DisplayNameFor(model => model.Discipline)</p>
</div>
<div class="display-field">
    @Html.DisplayEnumFor(model => model.Discipline, typeof(HiltiHaninge.Models.Discplines))
</div>

<div class="display-label">
     <p class="text_without_indent">@Html.DisplayNameFor(model => model.Level)</p>
</div>
<div class="display-field">
    @Html.DisplayEnumFor(model => model.Level, typeof(HiltiHaninge.Models.Levels))
</div>

<div class="display-label">
    <p class="text_without_indent">@Html.DisplayNameFor(model => model.Coach)</p>
</div>
<div class="display-field">
    @Html.DisplayFor(model => model.Coach)
</div>

</fieldset>
@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
<p>
    <input type="submit" value="Ta bort" /> |
    @Html.ActionLink("Tillbaka till listan", "Index")
</p>
}

任何人有任何想法,我将不胜感激。

【问题讨论】:

    标签: asp.net-mvc razor enums displayfor


    【解决方案1】:

    如果您只是想将枚举值输出为字符串,那么您可以这样做:

    <div class="display-field">
        @Enum.GetName(typeof(HiltiHaninge.Models.Discplines), Model.Discipline)
    </div>
    

    【讨论】:

    • 或者是否有特定的原因必须使用 DisplayFor?
    • 没有具体原因,只是知识不足。像魅力伙伴一样工作,谢谢!
    【解决方案2】:

    不过……

    如果您只是想修复您的 displayFor 方法,那么您可以将类型设为泛型而不是 int,例如

    public static IHtmlString DisplayEnumFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> ex, Type enumType) where TValue : struct, IConvertible
    {
        var value = (int)ModelMetadata.FromLambdaExpression(ex, html.ViewData).Model;
        string enumValue = Enum.GetName(enumType, value);
        return new HtmlString(html.Encode(enumValue));
    }
    

    我还添加了通常用作枚举约束的内容。见:Create Generic method constraining T to an Enum

    【讨论】:

    • 非常感谢,我会检查一下!
    【解决方案3】:

    这是broken and will not be fixed

    但您可以使用this 解决方法。

    【讨论】: