Telerik MVC Grid AJAX удаляет результаты в исключении - PullRequest
2 голосов
/ 21 апреля 2011

Я использую 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 будет играть хорошо. К сожалению, стандартные редакторы оставляют желать лучшего в производственном приложении.

Ответы [ 2 ]

1 голос
/ 05 мая 2011

Оказывается, это ошибка в расширениях MVC от Telerik.Я еще не просматривал их заметки о выпуске, но сегодня утром скачал и установил последнюю версию.Эта конкретная ошибка больше не появляется.

Есть и другие приятные функции, которые они добавили.Одним из самых важных для меня является пакетное редактирование в ячейке.=)

0 голосов
/ 25 апреля 2011

Я попытался немного поискать на форумах Telerik, чтобы увидеть, где может быть ваш ответ на этом сайте, но если он похож на тот, что здесь, у меня есть небольшой совет для вас. Не забудьте включить фрагменты кода, чтобы они соответствовали вашему описанию, поскольку ваша реализация может быть виновником.

Я настоятельно рекомендую продолжить в определенной теме на форумах Telerik, если вы не включили код в свое первое сообщение, поскольку этот код позволит кому-то немного лучше понять, почему вы получаете эту ошибку.

...