Я установил фильтр в своем источнике данных, чтобы при входе в сетку он был предварительно отфильтрован на основе кнопки, которую пользователь нажал.Это фильтрует элементы на основе статуса.Состояния являются перечислениями, и каждое перечисление имеет описание, потому что Items To Return выглядит лучше, чем ItemsToReturn.Тем не менее, пользователь может получить доступ к сетке, не используя один из этих параметров.Когда они это делают, сетка пуста, потому что когда ничего не выбрано, ничего не отображается.
@(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;
}
InitialФильтрация работает, проверяя, что пользователь нажал, чтобы попасть в сетку.Например, @ Model.Items.Where (e => e.Status == StatusType.ItemsToReturn) .Count ()
И затем в контроллере он определяет, что передается в сетку кендо.
[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 передается, и это вызывает исключение нулевой ссылки в методе расширения.Поэтому я попытался просто инициализировать Grid, не отправляя никакие параметры, но затем он проверяет, где StatusName равно null, а затем загружает пустое значение, потому что никогда не бывает времени, когда это происходит.
Я думал о добавлении события, которое проверяет, является ли значение ViewBag.Status нулевым, а затем перезагружается, но мне интересно, какой будет лучший метод.