【问题标题】:Telerik MVC Grid AJAX Delete Results in ExceptionTelerik MVC Grid AJAX 删除导致异常
【发布时间】:2011-08-10 08:15:48
【问题描述】:

我正在使用 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 网格会很好地发挥作用。不幸的是,默认编辑器在生产应用程序中还有很多不足之处。

【问题讨论】:

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


    【解决方案1】:

    事实证明,这似乎是 Telerik 的 MVC 扩展的一个错误。我还没有浏览他们的发行说明,但我今天早上确实下载并安装了最新版本。此特定错误不再出现。

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

    【讨论】:

      【解决方案2】:

      我尝试在 Telerik 论坛上搜索一下,看看您在该网站上的回复可能在哪里,但如果它与此处的类似,我确实有一个快速提示给您。请务必在描述中包含代码 sn-ps,因为您的实现可能是罪魁祸首。

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

      【讨论】:

      猜你喜欢
      • 2012-07-24
      • 1970-01-01
      • 1970-01-01
      • 2011-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 2012-12-07
      相关资源
      最近更新 更多