2010-07-06 48 views
1

我目前工作的一个ASP.NET 3.5的项目,我想知道您对以下情况的意见,我正好碰上有时:上动态或不创建控件

比方说我”已经在我的代码某处定义的组件框架的以下控制:

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

我们假设与上面提到的组件框架,它可以从客户机获得一个参考我的Window控制SID e。使用其ID(例如以改变其外观):

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

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

正如你可能已经注意到了,控制的ID作为一个硬编码字符串到GetWindow功能的传球有点问题在这里,因为改变控制的ID是要打破JavaScript函数。

这种情况肯定闻起来像它需要一个很好的ol'Replace Magic Number with Symbolic Constant重构。

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 %>") 
} 
我可以动态创建 Window控制和使用常数控制的 ID的价值实现这一目标

我现在的问题是:你如何处理这种情况?当您遇到这种情况时,您是否动态创建所有控件(如上面的示例中所示),并且使用此方法是否存在任何缺陷设计师不再显示控件?或者你说“拧它,没有人会改变该控制的ID”,并将其硬编码在您的代码?或者你有其他方法来处理这种情况?

我个人很喜欢第一个选项(重构),因为a)它确保对ID的更改不会破坏我的代码,并且b)我几乎从不使用Designer,但我想我会在SO上提出这个问题来获得一些有价值的意见。

在此先感谢所有回复。

问候,

的Glu

更新/澄清

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

但是,我的问题是另一个;控件和JavaScript方法都放置在不同的文件中,在这种情况下,使用控件的ID的上述方法不再适用。因此,我将我的问题中提到的解决方案与控件的不断创建和动态创建相结合。我现在纠正了我的问题中的两个文件名,以便描述与我的问题相关的正确方案。

回答

0

在4.0中,您可以很好地控制在主/内容页面情况下生成的客户端ID。但我相信如果有人在一个地方在页面中手动更改ID,而不是在JavaScript代码中,它仍然是一个问题。如果你是唯一一个将要处理这段代码的人,那么你可以始终保持警惕并正确地重构。否则,您可以进入常量选项或将ID存储在单独的资源文件中。

+0

感谢您的意见。我查看了ASP.NET 4.0附带的'ClientIDMode'属性。有'Static'模式,看起来像我的问题的解决方案,因为'ClientID'将与'ID'相同。然后,我可以写'GetWindow(“<%= windowTest.ClientID%>”),一切都会正常工作。如果有人要更改ID,当然,它会在运行时崩溃。但是再一次,使用'ClientIDMode =“Static”'确实比硬编码字符串更好。 – 2010-07-06 10:56:25

+0

是的,我想它比硬编码的字符串更好。 – 2010-07-06 11:30:46

0

在我opionion有一两个合适的解决方案:

1)使用jQuery框架得到阿霍德要通过JavaScript来ADRESS的HTML元素。 JQuery旨在能够使用自动生成的分层创建的控件ID
2)使用.net Framework 4.0并且不使用自动生成的控件ID。 (我听说这是4.0中的新功能,我认为在你的情况下可能值得尝试)

+0

感谢您的回复。实际上,我使用的是一个组件框架,它带有一个客户端API,所以不幸的是,jQuery不是一个选项。我将看看ASP.NET 4.0功能,尽管该项目使用ASP.NET 3.5,所以我不知道过渡是否会很快发生。 – 2010-07-06 07:43:49

0

看看里克斯特拉尔的博客文章标题为“A generic way to find ASP.NET ClientIDs with jQuery”......它似乎有一些好点子这可能对你有一些帮助。

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

+0

感谢您的链接。正如我在对citronsas的回答中所提到的,我正在使用一个组件框架,它本身带有一个自己的客户端API。这意味着我必须使用我的问题中提到的'GetWindow'方法来改变客户端的窗口外观,例如, 'GetWindow( 'myObject的')。的setSize(400400)'。 – 2010-07-06 10:17:13