当“数据源”过滤器不返回任何值时,如何显示网格中的所有项目?

时间:2019-02-14 14:40:28

标签: asp.net-core kendo-grid kendo-asp.net-mvc

我在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,然后重新加载,但是我想知道最佳实践是什么。

0 个答案:

没有答案