将代码移入DotNetNuke模块后,ClientID无效

时间:2009-07-25 03:49:25

标签: asp.net webforms dotnetnuke clientid

我正在将现有应用程序移植到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 Login控件现在输出无效的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问题的逗号,空格或其他字符?

谢谢, 罗杰

3 个答案:

答案 0 :(得分:1)

我(有点)想通了。我需要为添加到DotNetNuke页面的用户控件添加一个ID。这是主视图用户控件 - 继承PortalModuleBase的控件。用户控件完全包含在代码隐藏类(无.ascx)中,因此将此添加到Init事件中修复了所有内容:

this.ID =“gsp”;

我的理论是,当这些问题属实时,就会出现问题:

  1. “view”用户控件仅使用代码隐藏文件(无.ascx文件)

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

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

    不确定这是否是DNN错误,但我很高兴能够弄明白,现在可以继续......

答案 1 :(得分:0)

您可以尝试使用类来引用控件吗? 做这样的事情有很多好的功能。我会建议jquery开始,让所有事情都变得更容易。

答案 2 :(得分:-1)

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

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

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