私は何か変わった状況が続いています。私はいくつかの他のカスタム機能を実装するカスタムHTMLヘルパーでTelerik MVCグリッドを構築しようとしています。 (特に、行が選択されたときにグリッドの右側にフォームをレンダリングしますが、UI標準化のためにグリッドのボックス内編集機能を使用していません) HTMLの1行、Javascriptのほんの数行、ブームが完了しました。)Telerik MVC Gridが.ajaxRequestを呼び出した後にバインドに失敗する
すべての機能 - データの再バインドを除いてすべて機能します動的にグリッドがレンダリングされ、その選択が機能し、フォームが表示され、フォームはブラーイベントに保存されます。グリッドは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ヘルパーがthuslyと呼ばれていること:オン
<% using (Html.BeginForm()) {
Html.ListOfValuesEditorFor("JobTitleGrid", "RefreshJobTitles", "Home", "/Home/LoadJobTitle", Model);
} %>
すべてのOnDataBoundおよびOnDataBinding doは、ヒットしたことを示すメッセージを表示します。実際、彼らはコードの生産版にもしません。彼らはデバッグのためにそこにいます。
OnSelectは、フォームを表示して入力します。これは正しく起こっています。
フォーム自体は、テキストフィールドのonChangeイベントが発生するたびにオブジェクトを更新します。この部分は機能として検証されます。これは、$ .ajax()呼び出しを介して行われます。この呼び出しは再び機能するように検証されます。
その$のアヤックス()の呼び出しから成功のコールバックは、このようです:
function onSubmitComplete(responseData, callbackData) {
// Some irrelevant junk here
$('#JobTitleGrid').data('tGrid').ajaxRequest();
}
ajaxRequest
関数への呼び出し。サーバーでは、グリッドアクションが機能し、IJobTitleオブジェクトのIListを返します。クライアントでは、OnDataBindingが起動し、メッセージが表示されます。 OnDataBoundは決して起動せず、グリッド表示は更新されません。
これは、Telerikコントロールが通常使用される方法の範囲外であることはわかっていますが、それらを使用するのに必要な膨大な量のコードは、私のチームが可能な限り再利用可能なエンティティ(カスタムHTMLヘルパーなど) 。単純なコントロール(テキストボックス、カレンダーなど)では、カスタムヘルパーは常に「ただ働いた」。しかし、グリッドはこの問題を提示しています。
なぜデータをバインドしないのかについてのアイデアはありますか?もっと重要なことは、それを修正する方法ですか?