如何在网格行中显示枚举描述或名称?

wm_*_*wm_ 7 asp.net asp.net-mvc asp.net-mvc-4 kendo-ui kendo-grid

我在ASP.Net MVC应用程序中使用Kendo网格.如果我有以下网格定义,

@(Html.Kendo().Grid(Model) //Bind the grid to ViewBag.Products
  .Name("grid")
  .Columns(columns =>
  {
      columns.Bound(p => p.FullName);
      columns.Bound(p => p.MyEnum)
  })
  .Groupable()
  .Pageable()
  .Sortable()
  .Scrollable(scr => scr.Height(600))
  .Filterable()
  )
Run Code Online (Sandbox Code Playgroud)

其中一列是Enum.我的枚举定义是:

public enum MyEnum
{
    [Display(AutoGenerateField = false, Name = "My enum 1", Description = "My Enum 1")]
    EnumOne,
    [Display(Name = "My Enum 2")]
    EnumTwo
}
Run Code Online (Sandbox Code Playgroud)

如何让每行显示"My Enum 1"或"My Enum 2"?

提前致谢!

小智 6

我最近遇到了这个问题并通过使用解决了它

var someArrayOfValueAndText = new[] {new  {
    Id = 0, Description = "Foo"
}, new  {
    Id = 1, Description = "Bar"
}
.Columns(c.ForeignKey(m=> m.MyEnum, someArrayOfValueAndText, "Id","Description"))
Run Code Online (Sandbox Code Playgroud)

而不是.Bound方法


Hen*_*ema 2

我不久前创建了一个包含一些扩展方法的辅助类:

public static class EnumExtensions
{
    public static string GetDisplayName(this Enum enu)
    {
        var attr = GetDisplayAttribute(enu);
        return attr != null ? attr.Name : enu.ToString();
    }

    public static string GetDescription(this Enum enu)
    {
        var attr = GetDisplayAttribute(enu);
        return attr != null ? attr.Description : enu.ToString();
    }

    private static DisplayAttribute GetDisplayAttribute(object value)
    {
        Type type = value.GetType();
        if (!type.IsEnum)
        {
            throw new ArgumentException(string.Format("Type {0} is not an enum", type));
        }

        // Get the enum field.
        var field = type.GetField(value.ToString());
        return field == null ? null : field.GetCustomAttribute<DisplayAttribute>();
    }
}
Run Code Online (Sandbox Code Playgroud)

Name它包含两种提取属性Description的方法Display。显示名称:

columns.Bound(p => p.MyEnum.GetDisplayName())
Run Code Online (Sandbox Code Playgroud)

并进行描述:

columns.Bound(p => p.MyEnum.GetDescription())
Run Code Online (Sandbox Code Playgroud)

您必须在您的Web.config或您的视图中添加一条 using 语句。

更新

如果您在模型中为其创建一个属性会怎样:

public string MyEnumName
{
    get { return MyEnum.GetDisplayName(); }
}
Run Code Online (Sandbox Code Playgroud)

现在您应该能够使用:

columns.Bound(p => p.MyEnumName);
Run Code Online (Sandbox Code Playgroud)