2

既存のアプリケーションをDotNetNukeモジュールに移植していて、奇妙な動作を発見しました。コードがHTML要素を識別できるように、JavaScriptを作成するときにClientIDを使用します。通常、これにより次のような値が作成されます。

"g_ctl00_ctl01_ctl00_ctl00_txtSearch"

私たちは皆これを百万回見ましたね?このコードをDotNetNukeモジュールに移植して初めて実行した後、ClientIDプロパティは次のように返します。

"dnn_ctr397_GalleryServerPro.Web.Gallery, TechInfoSystems_ctl00_ctl01_ctl00_ctl00_txtSearch"

カンマとスペースに注意してください。これにより、あらゆる種類のJavaScriptエラーが発生します。たとえば、ASP.NETログインコントロールは無効なJavaScriptを出力しています。

var dnn_ctr397_GalleryServerPro.Web.Gallery, TechInfoSystems_ctl00_ctl01_ctl01_lv_ctl02_Login1_UserNameRequired = document.all ? document.all["dnn_ctr397_GalleryServerPro.Web.Gallery, TechInfoSystems_ctl00_ctl01_ctl01_lv_ctl02_Login1_UserNameRequired"] : document.getElementById("dnn_ctr397_GalleryServerPro.Web.Gallery, TechInfoSystems_ctl00_ctl01_ctl01_lv_ctl02_Login1_UserNameRequired");

私のモジュールのアセンブリ名はTechInfoSystems.GalleryServerPro.dllで、デフォルトの名前空間はGalleryServerPro.Webで、ユーザーコントロールはGallery.csという名前のクラスにあるため、余分なテキストの一部がどこから来ているのかを部分的に説明していますが、その理由そこにいますか?また、ClientIDがコンマ、スペース、またはjavascriptで問題を引き起こす可能性のあるその他の文字を出力しないようにするにはどうすればよいですか?

ありがとう、ロジャー

4

3 に答える 3

1

私は(ある程度)それを理解しました。DotNetNuke ページに追加されるユーザー コントロールに ID を追加する必要がありました。これはメイン ビューのユーザー コントロールで、PortalModuleBase を継承するものです。ユーザー コントロールはコード ビハインド クラス (.ascx なし) に完全に含まれているため、これを Init イベントに追加するとすべてが修正されます。

this.ID = "gsp";

私の理論では、これらが当てはまる場合に問題が発生します。

  1. "view" ユーザー コントロールは分離コード ファイルのみを使用します (.ascx ファイルは使用しません)。

  2. ユーザー コントロールに ID が指定されていません。

.ascx なしでモジュールを登録する場合、モジュール定義でクラスとアセンブリを指定する必要があります。私の場合は「GalleryServerPro.Web.Gallery, TechInfoSystems.GalleryServerPro」です。これは、DNN が最終的に clientID 文字列に挿入するテキストに非常によく似ています。ユーザー コントロールに ID が割り当てられていない場合、DNN (または ASP.NET) はその文字列を取得し、それを使用して clientID を構築する必要があります。

これが DNN のバグかどうかはわかりませんが、解決できてうれしいです。次に進むことができます...

于 2009-08-02T17:24:38.210 に答える
0

代わりにクラスを使用してコントロールを参照してみてください。そのようなことを行うための優れた関数がたくさんあります。すべてのことをより簡単にするために、最初は jquery をお勧めします。

于 2009-08-03T02:35:47.780 に答える
-1

なぜこれが起こっているのかわかりません(しかし、DNNを使用したことはありません)

できることは、影響を受けるサーバーコントロールのClientIDを自分で制御することです。たとえば、サーバーID = txtSearchのTextBoxコントロールを使用しているように見えます。できることは、TextBoxから継承するクラスを作成し、 ClientIdがサーバーIDと等しくなるようにする(txtSearchと呼ばれるコントロールが1つしかない場合)ここを参照してください

DNNがそれでもオーバーライドする可能性がありますが、一見の価値があるかもしれません

于 2009-07-31T18:10:43.953 に答える