关于动态创建控件还是不创建控件

时间:2010-07-06 07:05:49

标签: asp.net .net-3.5

我目前正在开发一个ASP.NET 3.5项目,我想知道您对以下情况的看法,我偶尔遇到这种情况:

假设我已在我的代码中的某处定义了以下对虚构组件框架的控制:

<Window runat="server" ID="windowTest" />

假设使用上面提到的虚构组件框架,可以使用其Window从客户端获取对ID控件的引用(例如改变它的外观):

function MyFunc(){
    var win = GetWindow("windowTest");
}

我们还假设两个代码段都放在不同的文件中,例如MasterPage.Master中的JavaScript代码和AnotherPage.aspx中的控件。

正如您可能已经注意到的那样,将控件的ID作为硬编码字符串传递给GetWindow函数在这里有点问题,因为更改控件的ID是打破JavaScript功能。

这种情况肯定闻起来需要一个很好的'Replace Magic Number with Symbolic Constant重构。我可以通过动态创建Window控件并使用常量作为控件ID的值来实现此目的:

AnotherPage.aspx

Window windowTest = new Window();
windowTest.ID = Consts.ID_WINDOW_TEST;
form1.Controls.Add(windowTest);

MasterPage.Master

function MyFunc(){
    var win = GetWindow("<%= My.Namespace.Consts.ID_WINDOW_TEST %>")
}

我现在的问题是:你如何处理这种情况?在遇到这种情况时,你是否动态创建了所有控件(如上例所示),并且使用此方法有任何缺点方法,例如Designer不再显示控件了?或者你说“拧它,没有人会改变那个控件的ID ”并在你的代码中保留硬编码?或者您有其他方法来解决这种情况吗?

我个人是第一个选项(重构)的粉丝,因为a)它确保对ID的更改不会破坏我的代码和b)我几乎从不使用设计师,但我想我会问这个问题,以获得一些有价值的意见。

提前感谢所有回复。

问候,

GIU

更新/澄清

我在这个问题的第一个版本中做了一个小错误,声明代码片段放在同一个文件中。由于控件和JavaScript方法都位于同一个文件中,因此无需动态创建控件并使用常量定义控件ID;通过直接在.aspx文件中定义控件,我可以在JavaScript方法中使用其ID,如下所示:GetWindow("<%= windowTest.ID %>");

但是,我的问题是另一个问题;控件和JavaScript方法都放在不同的文件中,在这种情况下,使用控件的ID所提到的方法不再起作用。因此,我引入了我的问题中提到的解决方案,包括控件的常量和动态创建。我现在纠正了我的问题中的两个文件名,以便描述与我的问题相关的正确方案。

3 个答案:

答案 0 :(得分:0)

在我的观点中,有两种合适的解决方案:

1)使用JQuery框架来获取您想通过JavaScript添加的html元素。 JQuery旨在能够使用自动生成的分层创建的控件ID 2)使用.net Framework 4.0,不要使用Control ID的自动生成。 (我听说这是4.0中的新功能。我认为在你的情况下可能值得尝试)

答案 1 :(得分:0)

查看Rick Strahl的博客文章“A generic way to find ASP.NET ClientIDs with jQuery”......似乎有一些好的想法对你有所帮助。

他使用jQuery,作为第一个响应者的建议,但它是以你使用ASP.NET的内置ClientID属性来获取ASP.NET生成的实际id并使用启用的客户端友好机制的方式你编写的脚本代码引用了不会因ID更改而中断的控件。

答案 2 :(得分:0)

在4.0中,您可以很好地控制在主页/内容页面情况下生成的客户端ID。但我相信,如果有人在一个地方手动更改了ID而不是javascript代码,那么它仍然是一个问题。如果你是唯一一个会使用这个代码的人,那么你总是可以正确地思考和重构。否则,您可以进入常量选项或将ID存储在单独的资源文件中。