0

が、私はこの剣道MVC UIのアイテムを持っている:Kendo Dialogの内容をKendo MVCの項目に置き換えますか?

@(Html.Kendo().Dialog() 
    .Name("Details") 
    .Title(GetText("menutreeselectionbutton", "Role/ManageRoleTemplates")) 
    .Content(
     Html.Kendo().TreeView() 
      .Name("menuTreeView") 
      .TemplateId("treeview-template") 
      .LoadOnDemand(false) 
      .AutoScroll(true) 
      .DataSource(source => 
      { 
       source.Model(model => model.Id("MenuItemId") 
        .HasChildren("HasChildren")) 
       .Read(read => read.Action("_GetMenuItems", "Role").Data("GetRoleIdFromHiddenField")) 
       .Events(e => e.RequestEnd("requestEndHandler")); 
      }) 
      .ToHtmlString() 
    ) 
    .Visible(false) 
    .Modal(true) 
    .Width(400) 
    .Actions(actions => 
    { 
     actions.Add().Text(GetText(Constant.CANCEL, Constant.TEXT_GLOBAL)); 
     actions.Add().Text(GetText(Constant.SAVE, Constant.TEXT_GLOBAL)).Primary(true).Action("saveMenuTreeSelection"); 
    })) 

アイデアは、そこにいくつかの情報を持つグリッドで、ツリービューでダイアログを開き、各エントリのためのボタンをクリックすることができるということですし、あなたはそこでいくつかの選択をすることができます。

問題は、このツリービューはページの読み込み時に読み込まれ、多くの不必要なトリップをバックエンドに費やすことです。前の選択からのツリービューが表示され、新しいデータがフェッチされてリロードされるため、ダイアログを閉じてグリッド内の別のエントリを開くときにも問題が発生します。

私は、ダイアログを開いたときにのみツリービューをロード(またはレンダリング)し、閉じたときに再び「クリア」します。

これを解決する方法はありますか?

私はjavascriptで読み込みアクションを置き換えようとしましたが、うまく動作しませんでした。

$("#Details").data("kendoDialog").content("@(Html.Kendo().TreeView() 
     .Name("menuTreeView") 
      .TemplateId("treeview-template") 
      .LoadOnDemand(false) 
      .AutoScroll(true) 
      .DataSource(source => 
      { 
       source.Model(model => model.Id("MenuItemId") 
        .HasChildren("HasChildren")) 
       .Read(read => read.Action("_GetMenuItems", "Role").Data("GetRoleIdFromHiddenField")) 
       .Events(e => e.RequestEnd("requestEndHandler")); 
      }) 
      .ToHtmlString().Replace(Environment.NewLine, ""))"); 

そして「作品」でなく、ここに示したように、それは、レンダリングのみ生のHTMLコードを表示するdoesntの:私もそう(少し読みやすくするため、ここでは修正された)のようなコンテンツを交換しようとした contents of dialog after setting content from javascript

私は迷っています。それはそのままで正常に動作しますが、まったく最適ではありません。

+0

MVCラッパー構文は、コントローラから返されたビューを作成するときにサーバー上でのみ動作するため、MVCラッパー構文を使用してDOMにコンテンツを動的に追加できないため、置換コンテンツは機能しません。代わりに、同等のjavascript jquery構文を使用してみてください。 – NigelK

+0

返信いただきありがとうございます。しかし、すべてのMVCラッパーがJavaScriptを生成するので、AFAIKは動作するはずです。これは、サーバーからページロード時に生成されたhtmlとjavascriptを出力します。一度それが生成された場合、それはあなたがそれを自分で作った場合と同じジャバスクリプトです。そして、私が心に留めていることのために、それは全くうまくいく。これは生のコードを表示するダイアログです。オリジナルの投稿をスクリーンショットで更新します。 –

答えて

0

私自身の解決策で始まった。似たようなものを解決して助けを求めている人にこれを追加します。 これは、ダイアログのコードです:

@(Html.Kendo().Dialog() 
    .Name("Details") 
    .Title(GetText("menutreeselectionbutton", "Role/ManageRoleTemplates")) 
    .Content(string.Empty) 
    .Visible(false) 
    .Modal(true) 
    .Width(400) 
    .Actions(actions => 
    { 
     actions.Add().Text(GetText(Constant.CANCEL, Constant.TEXT_GLOBAL)); 
     actions.Add().Text(GetText(Constant.SAVE, Constant.TEXT_GLOBAL)).Primary(true).Action("saveMenuTreeSelection"); 
    }) 
    .Events(e => e 
    .Hide("onDialogHide"))) 

何も普通の。 グリッド内のダイアログを表示するボタンをクリックすると、ダイアログにツリービューを挿入してダイアログを開いた関数が呼び出されます。次に、生成されたツリービューコードをJavaScriptと対話に注入する(注、上記の方法で周囲のコードを読みやすくするために除去されている):私は、剣道からの出力をエンコードするためにかみそり(又はMVC)からヘルパーを使用する方法

$("#Details").data("kendoDialog").content('@Html.Raw(HttpUtility.JavaScriptStringEncode(Html.Kendo().TreeView() 
        .Name("menuTreeView") 
        .TemplateId("treeview-template") 
        .LoadOnDemand(false) 
        .AutoScroll(true) 
        .DataSource(source => 
        { 
         source.Model(model => model.Id("MenuItemId") 
          .HasChildren("HasChildren")) 
         .Read(read => read.Action("_GetMenuItems", "Role").Data("GetRoleIdFromHiddenField")) 
         .Events(e => e.RequestEnd("requestEndHandler")); 
        }) 
        .ToString()))'); 

注意、また変更"ToHtmlString"を "ToString"に設定します。

私は何度もツリービューを交換するからトラブルに実行していけないことを確認するために、私は、ダイアログを閉じたときに、ツリービューをクリーンアップダイアログにイベントを追加しました:

function onDialogHide(e) { 
    $("#menuTreeView").data("kendoTreeView").destroy(); 
    $("#menuTreeView").remove(); 
} 

「隠します"イベントが選択されているのは、ダイアログが閉じられたときに最後に発生したイベントであるためです。

関連する問題