我目前工作的一个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
的上述方法不再适用。因此,我将我的问题中提到的解决方案与控件的不断创建和动态创建相结合。我现在纠正了我的问题中的两个文件名,以便描述与我的问题相关的正确方案。
感谢您的意见。我查看了ASP.NET 4.0附带的'ClientIDMode'属性。有'Static'模式,看起来像我的问题的解决方案,因为'ClientID'将与'ID'相同。然后,我可以写'GetWindow(“<%= windowTest.ClientID%>”),一切都会正常工作。如果有人要更改ID,当然,它会在运行时崩溃。但是再一次,使用'ClientIDMode =“Static”'确实比硬编码字符串更好。 – 2010-07-06 10:56:25
是的,我想它比硬编码的字符串更好。 – 2010-07-06 11:30:46