2011-10-17 13 views
0

私は何か変わった状況が続いています。私はいくつかの他のカスタム機能を実装するカスタムHTMLヘルパーでTelerik MVCグリッドを構築しようとしています。 (特に、行が選択されたときにグリッドの右側にフォームをレンダリングしますが、UI標準化のためにグリッドのボックス内編集機能を使用していません) HTMLの1行、Javascriptのほんの数行、ブームが完了しました。)Telerik MVC Gridが.ajaxRequestを呼び出した後にバインドに失敗する

すべての機能 - データの再バインドを除いてすべて機能します動的にグリッドがレンダリングされ、その選択が機能し、フォームが表示され、フォームはブラーイベントに保存されます。グリッドは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ヘルパーが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ヘルパーなど) 。単純なコントロール(テキストボックス、カレンダーなど)では、カスタムヘルパーは常に「ただ働いた」。しかし、グリッドはこの問題を提示しています。

なぜデータをバインドしないのかについてのアイデアはありますか?もっと重要なことは、それを修正する方法ですか?

答えて

0

解決策を思いついた後、私は簡単に質問を削除すると考えました - Telerikのグリッドはここでは最小限しか関与していません。しかし、私は、フレームワークの上に構築されているときに、フレームワークの上に構築されているフレームワークの上に構築されている場合、コードのトラブルシューティングがいかに難しいかを最初に知っています。 :)だからうまくいけば、この答えは、ラインの次の男を助ける。

グリッドアクションのDAL呼び出しから実際の問題がシリアル化例外であることが判明しました。これは私にとって奇妙に思えました。なぜなら、インデックスアクションのプリロードされたビューとGridActionのレスポンスの両方を読み込むために同じ呼び出しを使用していたからです。しかし、Javascriptで十分に深くデバッグすると、 。例外は処理されませんでした(プロフェッショナル:グリッド用のOnErrorハンドラを実装する)、バインドするデータがないため、クライアント側の再バインドに失敗しました。

私がシリアル化の問題を解決したら、すべてが魔法のように機能し、全体のエンティティデータ入力画面全体を実装するために約20行のコードがダウンしました。

関連する問題