Telerik MVC网格AJAX删除结果异常

时间:2011-04-21 13:53:27

标签: ajax asp.net-mvc-2 telerik telerik-grid

我正在使用来自MVC Extensions的Telerik网格控件。我已将其设置为使用控制器上的操作方法通过AJAX调用执行选择,插入,更新和删除。我在每行中都有一个编辑命令按钮,显示一个弹出窗体,用于编辑或创建网格中显示的实体。我还在EditorTemplates中为对象类型定义了一个模板。这一切都按预期运作。当我尝试在行中添加删除命令按钮时出现问题。它导致了这个例外:

模板只能用于字段访问,属性访问,单维数组索引或单参数自定义索引器表达式。

我已经确认这与我使用编辑/删除正常工作的编辑器模板无关。我没有看到删除命令和编辑器模板如何相互冲突。这是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 个答案:

答案 0 :(得分:1)

事实证明,这似乎是Telerik的MVC扩展的一个错误。我还没有阅读他们的发行说明,但我今天早上下载并安装了最新版本。这个特殊的错误不再起作用。

他们也添加了一些其他不错的功能。对我来说最重要的一个是批量单元格编辑。 =)

答案 1 :(得分:0)

我试图在Telerik论坛上搜索一下,看看你在该网站上的回复可能是什么,但是如果它与这里的响应类似,我会给你一个快速提示。请确保包含与您的说明一致的代码段,因为您的实施可能是罪魁祸首。

如果您没有在第一篇文章中包含代码,我强烈建议您在Telerik论坛的特定主题中进行跟进,因为代码将允许某人更好地了解您收到此错误的原因。