2

我将现有应用程序移植到 DotNetNuke 模块并发现了奇怪的行为。我在创建 javascript 时使用 ClientID,以便代码可以识别 HTML 元素。通常这会创造一个像这样的价值:

"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. “查看”用户控件仅使用代码隐藏文件(无 .ascx 文件)

  2. 用户控件没有指定 ID。

注册没有 .ascx 的模块时,必须在模块定义中指定类和程序集。就我而言,它是“GalleryServerPro.Web.Gallery,TechInfoSystems.GalleryServerPro”。这看起来非常接近文本 DNN 最终插入到 clientID 字符串中。DNN(或 ASP.NET)必须使用该字符串并在没有在用户控件中分配的 ID 的情况下使用它来构建 clientID。

不确定这是否是 DNN 错误,但我很高兴能解决这个问题,现在可以继续……

于 2009-08-02T17:24:38.210 回答
0

您可以尝试使用类来引用您的控件吗?有很多很好的功能可以做这样的事情。我会推荐 jquery 作为开始,让 javascript 的一切变得更容易。

于 2009-08-03T02:35:47.780 回答
-1

我不知道为什么会这样(但我从来没有使用过 DNN)

您可以做的是自己控制受影响的服务器控件的 ClientID,例如,看起来您正在使用服务器 ID = txtSearch 的 TextBox 控件,您可以做的是创建一个从 TextBox 继承的类并设置其ClientId 等于服务器 ID(假设只有一个名为 txtSearch 的控件)请参见此处

可能 DNN 甚至会覆盖它,但它可能值得一试

于 2009-07-31T18:10:43.953 回答