Я пытаюсь создать сетку кендо для списка контактов со следующими требованиями:
Чтобы добиться этого, это представление, которое я создал до сих пор:
@using MyProject.Contacts.Models;
@using Kendo.Mvc.UI;
@{
ViewBag.Title = "Contacts";
}
<div id = "contactsContainer" class = "">
@(Html.Kendo().Grid<ContactsViewModel>()
.Name("ContactsGrid")
.Columns(columns =>
{
columns.Bound(p => p.ContactName).Title("Contact Name").Width(200);
columns.Bound(p => p.ContactGroups).ClientTemplate("#= displayContactGroups(ContactGroups)#").EditorTemplateName("ContactGroupsEditor").Title("ContactGroups").Width(200);
columns.Command(command =>
{
command.Edit().IconClass("k-icon k-i-edit");
command.Destroy().IconClass("k-icon k-i-delete");
}
).Title("Actions").Width(200);
})
.NoRecords(n => n.Template("No Contacts to display"))
.ToolBar(tools =>
{
tools.Create().Text("Create New Contact");
})
.DataSource(dataSource => dataSource
.Ajax()
.PageSize(10)
.Model(model =>
{
model.Id(m => m.kendoId);
}
)
.Create(create => create.Action("CreateContact", "Contacts"))
.Read(read => read.Action("GetContacts", "Contacts"))
.Update(update => update.Action("UpdateContact", "Contacts"))
.Destroy(destroy => destroy.Action("DeleteContact", "Contacts"))
)
)
</div>
<script>
function displayContactGroups(contactGroups) {
if (contactGroups == null) {
return "";
}
return contactGroups.join(", ");
}
</script>
А вот частичное представление, которое я определил для ContactGroupsEditor:
@model List<string>
@(Html.Kendo().MultiSelect()
.Name("ContactGroups")
.DataValueField("Text")
.DataTextField("Text")
.BindTo(new List<SelectListItem>
{
new SelectListItem { Text = "GalacticEmpire"},
new SelectListItem { Text = "RebelAlliance"}
})
.Value(Model)
)
Это очень близко к тому, чтобы работать так, как я хочу. Когда я загружаю страницу, сетка отображается так, как я хочу, кнопка «Удалить» работает должным образом, а кнопка «Редактировать» правильно переключает столбец «Группы контактов» на элемент «Множественный выбор». У меня проблема с кнопкой «Создать новый контакт». Когда я нажимаю на нее, я получаю сообщение об ошибке консоли: Uncaught ReferenceError: ContactGroups не определен. Я подозреваю, что это происходит потому, что когда я создаю новую строку, она пытается оценить оператор JavaScript в операторе ClientTemplate в сетке и терпит неудачу, потому что ему еще не присвоено значение. Как я могу это исправить?
Я подозреваю, что вы правы. В ошибке указано, что ContactGroups не определены, что, вероятно, происходит в функции соединения. Вы проверяете, является ли оно нулевым, но если оно не определено, это не поймает. Если вы измените функцию таким образом, она будет обслуживать как null, так и undefined:
<script>
function displayContactGroups(contactGroups) {
if (!contactGroups) {
return "";
}
return contactGroups.join(", ");
}
</script>
Я не уверен на 100%, поскольку корпус ContactGroups в ошибке не такой, как в функции.
Я тоже только что попробовал .ClientTemplate("#= ContactGroups ? displayContactGroups(ContactGroups) : '' #")
и получил ту же ошибку. Похоже, что простой улов для null или undefined не помогает
Добавьте значение по умолчанию для свойства ContactGroups в определении модели источника данных:
model.Field(p => p.ContactGroup).DefaultValue(new List<string>());
Таким образом, ClientTemplate будет успешно выполнен.
Спасибо за ответ! Я только что попробовал это улучшение, и оно не изменило сообщение об ошибке. У вас есть другие мысли, в чем может быть дело?