Я использую Telerik Grid control из расширений MVC. Он настроен на использование методов действия на контроллере для выполнения выбора, вставки, обновления и удаления через вызовы AJAX. У меня есть кнопка «Редактировать» в каждой строке, которая отображает всплывающую форму для редактирования или создания объектов, отображаемых в сетке. Я также определил шаблон для типа объекта в EditorTemplates. Это все работает, как и ожидалось. Проблема возникает, когда я пытаюсь добавить кнопку «Удалить» в строке. Это приводит к этому исключению:
Шаблоны могут использоваться только с доступом к полю, доступом к свойству, индексом одномерного массива или выражениями настраиваемого индексатора с одним параметром.
Я проверил, что это связано с шаблоном редактора, который я использую, так как Редактировать / Удалить работать правильно без него. Я не вижу, как команда Delete и шаблон редактора конфликтуют друг с другом. Это ошибка Telerik? Я пробовал их форумы и не получил никаких ответов.
Вот код:
this.Html.Telerik().Grid(this.Model.RuleSet.ValueRules)
.Name("ValueRuleGrid")
.DataKeys(keys => { keys.Add<Int64>(r => r.ID); })
.DataBinding(binding => {
binding.Ajax()
.Select(this.Model.AjaxSelectMethod)
.Insert(this.Model.AjaxInsertMethod)
.Update(this.Model.AjaxUpdateMethod)
.Delete(this.Model.AjaxDeleteMethod)
;
})
.Columns(columns => {
columns.Bound(r => r.Section.Name).Title("Section");
columns.Bound(r => r.ItemName).Title("Question Code");
columns.Bound(r => r.Expression);
columns.Bound(r => r.Result);
columns.Command(commands => {
commands.Edit();
// FIX: When this is not commented out
// the page can't be loaded and results in an exception
//commands.Delete();
}).Width(200);
})
.ToolBar(toolbar => {
toolbar.Insert().ButtonType(GridButtonType.ImageAndText);
})
.Pageable(paging => {
paging.PageSize(6);
})
.Editable(editor => {
editor.Mode(GridEditMode.PopUp);
})
.Filterable()
.Sortable(sorting => {
sorting.Enabled(true);
sorting.SortMode(GridSortMode.MultipleColumn);
sorting.OrderBy(t => t.Add(vr => vr.SectionName));
sorting.OrderBy(t => t.Add(vr => vr.ItemName));
sorting.OrderBy(t => t.Add(vr => vr.Result));
})
.Render();
А это шаблон редактора:
<script type = "text/javascript">
function onChange_SectionName(e) {
var sectionName = $("#SectionName").data("tAutoComplete").value();
var itemName = $('#ItemName').data('tAutoComplete');
itemName.value("");
if (sectionName.length > 0) {
itemName.ajax.selectUrl =
'<%:
this.Url.Action("GetSectionItemNames", "Scoring")
%>?sectionName=' + sectionName;
$('#ItemName').attr("disabled", "");
}
else {
$('#ItemName').attr("disabled", "disabled");
}
}
</script>
<table>
<tr>
<td>Section:</td>
<td><%: this.Html.HiddenFor(vr => vr.ID) %>
<% this.Html.Telerik().AutoComplete()
.Name("SectionName")
.DataBinding(binding => {
binding.Ajax()
.Cache(true)
.Select("GetSectionNames", "Scoring");
})
.ClientEvents(events => {
events.OnChange("onChange_SectionName");
})
.Filterable(filtering => {
filtering.FilterMode(AutoCompleteFilterMode.Contains);
filtering.MinimumChars(1);
})
.AutoFill(true)
.Multiple(m => m.Enabled(false))
.HighlightFirstMatch(true)
.Render(); %></td>
</tr>
<tr>
<td>Item:</td>
<td><% this.Html.Telerik().AutoComplete()
.Name("ItemName")
.DataBinding(binding => {
binding.Ajax()
.Cache(false)
.Select("GetSectionItemNames", "Scoring", new {
sectionName = ""
});
})
.Filterable(filtering => {
filtering.FilterMode(AutoCompleteFilterMode.Contains);
filtering.MinimumChars(1);
})
.AutoFill(true)
.Multiple(m => m.Enabled(false))
.HighlightFirstMatch(true)
.Render(); %></td>
</tr>
<tr>
<td>Operator:</td>
<td><% this.Html.RenderAction("RuleOperatorComboBox", "Scoring", new {
valueRule = this.Model
}); %></td>
</tr>
<tr>
<td>Value 1:</td>
<td><%: this.Html.TextBoxFor(r => r.Value1) %></td>
</tr>
<tr>
<td>Value 2:</td>
<td><%: this.Html.TextBoxFor(r => r.Value2) %></td>
</tr>
<tr>
<td>Result/Weight:</td>
<td><% this.Html.Telerik().NumericTextBoxFor(vr => vr.Result)
.MinValue(1)
.MaxValue(500)
.DecimalDigits(0)
.Value(1)
.Render(); %></td>
</tr>
</table>
Если я избавлюсь от шаблона редактора, сетка Telerik будет играть хорошо. К сожалению, стандартные редакторы оставляют желать лучшего в производственном приложении.