【问题标题】:Telerik MVC Grid fails to bind after calling .ajaxRequestTelerik MVC Grid 在调用 .ajaxRequest 后无法绑定
【发布时间】:2011-10-17 20:21:36
【问题描述】:

我遇到了一些奇怪的情况。我正在尝试在实现一些其他自定义功能的自定义 HTML 助手中构建 Telerik MVC 网格。 (Amongst other things, it renders a form to the right of the grid when a row is selected. We're not using the in-box editing features of the grid due to UI standardization. The whole requirement is that, for simple list-数据库中的值表,我们想要一种最少代码的方法。HTML 中的一行,最多几行 Javascript,然后繁荣,完成。)

一切正常——除了动态重新绑定数据。网格呈现,其选择起作用,表单显示,表单保存在模糊事件中。网格遇到 OnDataBinding 事件,但之后没有任何反应。它永远不会到达 OnDataBound 事件,也永远不会命中网格对象本身的内部 bindTobindData 方法。

“足够”的代码(很多无法显示)因此是(HTML 助手):

    public static void ListOfValuesEditorFor<TModel, TModelCollection>(this HtmlHelper<TModelCollection> htmlHelper, string gridName, string refreshAction, string refreshController, string loadItemUrl, IEnumerable<TModel> model) where TModel : class where TModelCollection : IEnumerable<TModel>
    {
        var factory = HtmlHelperExtension.Telerik<TModelCollection>(htmlHelper);
        var grid = factory.Grid(model);
        grid = grid.Name(gridName).Pageable(pager => pager.Enabled(false)).Selectable(select => select.Enabled(true)).Filterable(filter => filter.Enabled(false)).Scrollable().Sortable(sort => sort.Enabled(false));
        grid = grid.DataBinding(binding => binding.Ajax().Select(refreshAction, refreshController));
        grid = grid.ClientEvents(events =>
        {
            events.OnDataBound("Telerik.ListOfValues.OnDataBound");
            events.OnDataBinding("Telerik.ListOfValues.OnDataBinding");
            events.OnRowSelect("Telerik.ListOfValues.SelectRow");
        });

        var textControls = new List<string>();
        int idColumn = -1;
        grid = grid.Columns(columns =>
        {
            int cellCount = 0;
            foreach (var prop in typeof(TModel).GetProperties())
            {
                // Populates columns, creates text entry controls in the list, 
                // handles some other proprietary work.
                // SNIP
            }
        });

        // Container for the form
        var formDivBuilder = new TagBuilder("div");
        // Build out the form
        // SNIP

        // Render to the response
        var response = HttpContext.Current.Response;
        response.Write("<input type=\"hidden\" id=\"loadItemUrl\" value=\"" + loadItemUrl + "\" />");
        response.Write("<input type=\"hidden\" id=\"idColumnIndex\" value=\"" + idColumn.ToString() + "\" />");
        grid.Render();
        response.Write(formDivBuilder.ToString(TagRenderMode.Normal));
    }

HTML 助手就是这样调用的:

<% using (Html.BeginForm()) {
    Html.ListOfValuesEditorFor("JobTitleGrid", "RefreshJobTitles", "Home", "/Home/LoadJobTitle", Model);
} %>

在世界的 Javascript 方面,所有 OnDataBound 和 OnDataBinding 所做的只是显示消息,表明它们已被击中。事实上,他们甚至不会进入代码的生产版本。他们现在在那里进行调试。

OnSelect 显示并填充表单。这是正确的。

只要文本字段的 onChange 事件触发,表单本身就会更新对象。这部分被验证为功能。这是通过 $.ajax() 调用完成的,再次验证该调用是否正常运行。

$.ajax() 调用的成功回调如下:

function onSubmitComplete(responseData, callbackData) {
    // Some irrelevant junk here
    $('#JobTitleGrid').data('tGrid').ajaxRequest();
}

ajaxRequest 函数的调用。在服务器上,我的网格操作起作用,返回 IJobTitle 对象的 IList。在客户端, OnDataBinding 触发,显示其消息。 OnDataBound 永远不会触发,并且网格显示不会更新。

我知道这在一定程度上超出了 Telerik 控件的正常使用方式,但是使用它们所需的大量代码鼓励我的团队尽可能尝试创建可重用的实体(例如这些自定义 HTML 帮助程序)。对于更简单的控件(文本框、日历等),我们的自定义助手总是“正常工作”。然而,网格正在呈现这个问题。

关于我们为什么永远无法绑定数据的任何想法?更重要的是,如何解决?

【问题讨论】:

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


    【解决方案1】:

    在提出解决方案后,我曾短暂考虑过删除这个问题——Telerik 的网格在这里只涉及到最低限度。但是,我直接知道当您在框架之上构建代码时对代码进行故障排除有多么困难,这些框架构建在框架之上,而框架又进一步构建在框架之上。 :) 所以希望这个答案能帮助下一个人。

    实际问题是网格操作中 DAL 调用的序列化异常。这对我来说似乎很奇怪,因为我使用完全相同的调用来填充 Index 操作中的预加载视图和来自 GridAction 的响应,但可以肯定的是,如果我在 Javascript 中进行了足够深入的调试,我最终找到了它.没有处理异常(专业提示:为网格实现 OnError 处理程序),因此客户端重新绑定失败,因为它没有要绑定的数据。

    一旦我解决了序列化问题,一切都神奇地工作了,我们只需要大约 20 行代码就可以实现一个完整的通用实体数据输入屏幕。

    【讨论】:

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