我在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()
)
其中一列是Enum。我的枚举定义是:
public enum MyEnum
{
[Display(AutoGenerateField = false, Name = "My enum 1", Description = "My Enum 1")]
EnumOne,
[Display(Name = "My Enum 2")]
EnumTwo
}
如何让每行显示“My Enum 1”或“My Enum 2”?
提前致谢!
答案 0 :(得分:6)
我最近遇到了这个问题并使用
解决了这个问题var someArrayOfValueAndText = new[] {new {
Id = 0, Description = "Foo"
}, new {
Id = 1, Description = "Bar"
}
.Columns(c.ForeignKey(m=> m.MyEnum, someArrayOfValueAndText, "Id","Description"))
而不是.Bound方法
答案 1 :(得分: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>();
}
}
它包含两种提取Name
属性的Description
和Display
的方法。显示名称:
columns.Bound(p => p.MyEnum.GetDisplayName())
有关说明:
columns.Bound(p => p.MyEnum.GetDescription())
您必须在Web.config
或视图中添加使用声明。
<强>更新强>
如果您在模型中为其创建属性,该怎么办:
public string MyEnumName
{
get { return MyEnum.GetDisplayName(); }
}
现在你应该可以使用:
columns.Bound(p => p.MyEnumName);
答案 2 :(得分:2)
Henk的解决方案很好。但是,如果使用ClientTemplate,则可以使用过滤功能:
col.Bound(m => m.MyEnum) // this provides you filtering
.ClientTemplate("#: MyEnumName #") // this shows a name of enum
有关kendo ui模板的详细信息,请参阅:http://docs.telerik.com/kendo-ui/framework/templates/overview
答案 3 :(得分:2)
我使用@ 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();
});
})
希望它对你有所帮助。