【发布时间】: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 事件,也永远不会命中网格对象本身的内部 bindTo 或 bindData 方法。
“足够”的代码(很多无法显示)因此是(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