我在DataSource中设置了一个过滤器,以便在进入网格后将根据用户单击的按钮对其进行预过滤。这将根据状态过滤项目。状态为枚举,每个枚举都有一个描述,因为“要返回的项目”看起来比“要返回的项目”更好。但是,有一种方法使用户无需使用这些选项之一即可进入网格。当他们这样做时,网格为空白,因为什么都不选择,什么也没有显示。
@(Html.Kendo().Grid<Item>()
.Name("grid").Scrollable(c => c.Enabled(true).Height(1000))
.DataSource(dataSource => dataSource
.Ajax()
.Filter(f=>f.Add(a=>a.StatusName).IsEqualTo(ViewBag.Status))
.Read(read => read.Action("KendoInitializer", "Controller"))
.PageSize(20)
)
在数据源中设置过滤器。它使用StatusName,这是我的ViewModel的未映射成员
[NotMapped]
public string StatusName => Status.GetDescription();
获取状态并使用扩展方法来获取枚举的描述
public static string GetDescription(this Enum e)
{
var field = e.ToString();
var attribute = e.GetType().GetField(field).GetCustomAttributes(typeof(DescriptionAttribute), false).FirstOrDefault();
return attribute != null ? ((DescriptionAttribute)attribute).Description : field;
}
初始筛选通过检查用户单击以进入网格的方式起作用。例如 @ Model.Items.Where(e => e.Status == StatusType.ItemsToReturn).Count()
然后在控制器中确定将哪些内容传递给Kendo网格。
[HttpGet]
public ActionResult DeviceLogWIP(StatusType status)
{
ViewBag.Title = "Device Log - WIP";
List<Item> items= new List<Item>();
if (status.ToString() != "" && status.ToString() != null && status!= 0)
{
ViewBag.Status = status.GetDescription();
items= _itemDeviceService.GetItems().ToList();
}
else
{
items= _itemDeviceService.GetItemss().ToList();
}
return View(new DeviceLogViewModel()
{
Items= items
});
}
如果未选择任何内容,那么将传递0,并且在扩展方法中引发null引用异常。因此,我尝试通过不发送任何参数来使其初始化Grid,但随后它检查以查看StatusName等于null的位置,然后将其加载为空白,因为永远不会发生这种情况。
我曾考虑添加一个事件,以检查ViewBag.Status的值是否为null,然后重新加载,但是我想知道最佳实践是什么。