【问题标题】:DropDownList issue with Enums枚举的 DropDownList 问题
【发布时间】:2017-07-23 19:30:27
【问题描述】:

我目前正在本地化一个开源项目,但我遇到了 Enums 问题。

这是我的 Enums.cs(不是整个文件,只是问题出现的一部分)。

 public enum ModeratorLevel
    {
        [Display(Name = "Sahip")]
        Owner = 1,
        [Display(Name = "Moderatör")]
        Moderator = 2,
        [Display(Name = "Temizlikçi")]
        Janitor = 3,
        [Display(Name = "Boyacı")]
        Designer = 4,
        [Display(Name = "Paylaşımcı")]
        Submitter = 99
    }

这是我的视图(同样,不是整个文件,只包含我要修复的代码)

@{
    string subverseName = ViewBag.SubverseName;

    var levelsAvailable  = Enum.GetValues(typeof(ModeratorLevel)).OfType<ModeratorLevel>();
    var currentLevel = ModeratorPermission.Level(User.Identity.Name, subverseName);
    levelsAvailable = levelsAvailable.Where(x => x > currentLevel || currentLevel == ModeratorLevel.Owner);

}

@* these areas contain other codes is not related to my issue *@

        <div class="form-group">
            @Html.Label("foo", htmlAttributes: new {@class = "control-label col-md-2"})
            <div class="col-md-4">
                @Html.DropDownListFor(model => model.Power, levelsAvailable.Select(x => new SelectListItem() { Text = x.ToString(), Value = ((int)x).ToString() }), new { @class = "form-control"} )
                @Html.ValidationMessageFor(model => model.Power, "", new {@class = "text-danger"})
            </div>
        </div>

@* these areas contain other codes is not related to my issue *@

这是输出; dropdownlist

现在,我想要什么? 我想显示 DisplayNames 而不是 Enum 值。 出口看起来像:

  • foo = 所有者
  • 版主
  • 看门人
  • 设计师
  • 提交者

但我想展示它的样子:

  • foo = Sahip
  • 主持人
  • Temizlikçi
  • 博亚茨
  • Paylaşımcı

但在这种变化中,变化必须只是视觉上的。我们不应该更改任何影响 Enum 功能的代码。我只想显示 DisplayNames 而不是 Enum 值。

谢谢。

【问题讨论】:

    标签: c# asp.net asp.net-mvc enums


    【解决方案1】:

    您可以添加扩展方法:

    public static string DisplayName(this Enum value)
        {
            Type enumType = value.GetType();
            var enumValue = Enum.GetName(enumType, value);
            MemberInfo member = enumType.GetMember(enumValue)[0];
    
            var attrs = member.GetCustomAttributes(typeof(DisplayAttribute), false);
            var outString = ((DisplayAttribute)attrs[0]).Name;
    
            if (((DisplayAttribute)attrs[0]).ResourceType != null)
            {
                outString = ((DisplayAttribute)attrs[0]).GetName();
            }
    
            return outString;
        }
    

    然后在视图中使用它:

    @Html.DropDownListFor(model => model.Power, levelsAvailable.Select(x => new SelectListItem() { Text = x.DisplayName(), Value = ((int)x).ToString() }), new { @class = "form-control"} )
    

    【讨论】:

    • 抱歉我的新手问题,但我应该在哪里添加第一个字符串代码?
    • 你可以在你的项目中创建一个类添加方法
    • 对不起,我没有足够的asp和MVC经验(我只是想学习和本地化这个项目。你能和我分享一个文档是怎么做的吗?或者你能解释一下吗? :(谢谢。
    • 例如,您可以在 Web 项目“Helpers”中创建一个文件夹。然后在文件夹“EnumHelper”中添加新类,将 DisplayName 方法放在此类中。转到视图和对帮助器的引用@using nameSpace.EnumHelper
    • 毕竟,这就像一个魅力。感谢您的帮助。
    【解决方案2】:

    使用EnumDropDownListFor 助手

    @Html.EnumDropDownListFor(model => model.Power)
    

    【讨论】:

    • 这不起作用,因为 OP 不希望枚举中的所有项目都有下拉列表。如果你注意的话,OP 正在过滤它们。
    • 另外,EnumDropDownListFor() 仅在 MVC-5.1 或更高版本中可用
    猜你喜欢
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多