【问题标题】:How to display enum description or name in a grid row?如何在网格行中显示枚举描述或名称?
【发布时间】:2013-11-05 17:20:32
【问题描述】:

我在我的 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()
  )

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

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

如何让它在每一行显示“我的枚举 1”或“我的枚举 2”?

提前致谢!

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-4 kendo-ui kendo-grid


    【解决方案1】:

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

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

    而不是 .Bound 方法

    【讨论】:

    • 数组声明放在哪里?
    • 如果您需要可导出网格,这将不起作用。不调用 JS 函数,只导出数据。
    【解决方案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>();
        }
    }
    

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

    columns.Bound(p => p.MyEnum.GetDisplayName())
    

    关于描述:

    columns.Bound(p => p.MyEnum.GetDescription())
    

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

    更新

    如果你在你的模型中为它​​创建一个属性会怎样:

    public string MyEnumName
    {
        get { return MyEnum.GetDisplayName(); }
    }
    

    现在你应该可以使用了:

    columns.Bound(p => p.MyEnumName);
    

    【讨论】:

    • 我尝试了上述方法,但在运行应用程序时出现错误。错误是“绑定列需要字段或属性访问表达式。”。感谢您的快速回复!
    • 如果像上面这样绑定,是不是就不能使用网格的过滤能力了?目前,由于它绑定到一个实际的枚举,我得到一个组合框,其中包含所有不同的枚举值,以在过滤器菜单中进行选择。
    • @wm_ 过滤确实不再起作用了。也许 Kendo 网格提供了一些功能来自定义单元格中的数据?我没有这方面的经验。对不起。
    • 不用担心。非常感谢您的帮助!
    【解决方案3】:

    Henk 的解决方案很好。但是,如果您使用 ClientTemplate,您可以使用过滤功能:

    col.Bound(m => m.MyEnum)              // this provides you filtering
       .ClientTemplate("#: MyEnumName #") // this shows a name of enum
    

    有关剑道 ui 模板的更多信息,请参阅:http://docs.telerik.com/kendo-ui/framework/templates/overview

    【讨论】:

    • 完美。为我工作。
    【解决方案4】:

    我使用@user1967246 方法,想详细说明我该怎么做。

    我在剑道网格顶部创建了数组

        var statusLikeEntityStatus = new[]
        {
            new {Id = 0, Status = EntityStatus.Passive},
            new {Id = 1, Status = EntityStatus.Active},
            new {Id = 2, Status = EntityStatus.Draft},
            new {Id = 3, Status = EntityStatus.ReadyToLive},
            new {Id = -1, Status = EntityStatus.Freezed},
            new {Id = -2, Status = EntityStatus.Blocked}
        };
    

    然后我使用 ForeignKey 属性而不是 Bound。

         columns.ForeignKey(m => m.Status, statusLikeEntityStatus, "Id", "Status").Title(Resources.General.Status);
    

    这是我的列属性

    .Columns(columns =>
          {
              columns.Bound(m => m.InventoryID).Title("Id");
              columns.Bound(m => m.ERPCode).Title(Resources.Products.ProductCode);
              columns.Bound(m => m.Price).Title(Resources.Products.ListPrice);
              columns.Bound(m => m.Discount).Title(Resources.Products.
              columns.Bound(m => m.Stock).Title(Resources.Products.TotalStock); // todo: Resources
              columns.ForeignKey(m => m.Status, statusLikeEntityStatus, "Id", "Status").Title(Resources.General.Status);
    
              columns.Command(commandConf =>
              {
                  commandConf.Edit();
                  commandConf.Destroy();
              });
          })
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 2021-04-17
      • 2022-10-03
      • 1970-01-01
      相关资源
      最近更新 更多