2010-07-08 48 views
2

我想知道是否有可能在aspx页面上有一个asp超链接,并且在后面的代码中将其设置为Page_Load部分中的新超链接。我试过这个,看起来不行,但想知道更多关于这个机制的东西(这是不是工作,或者可以在页面生命周期的早期工作,或者为什么它不工作)。是否有可能从代码背后设置一个新的ASP超链接

示例代码

ASPX页面

<asp:HyperLink ID="myHyperLink" runat="server" /> 

代码隐藏

​​

回答

0

.NET有一个垃圾收集器负责其代码清理。这就是为什么你(通常)不需要析构函数。

这种情况下相关的事情是,当没有任何引用它时,某些东西“消失”。

什么也是myHyperLink代表。 myHyperLink不是对象本身,它是指针的对象。在某些基本类型中,如int不是这种情况,但在处理复杂对象时,就是这样。所以在这种情况下,你有myHyperLink指针和myHyperLink指向的对象。这个区别非常重要。

在你的代码中,我们有超链接本身和myHyperLink指针。超链接对象本身由Page.Form引用。控件您当地对myHyperLink的引用。

当你说

myHyperLink = newHyperLink;

你所做的是改变myHyperLink指针指向的内容。原始超链接仍然存在于Page.Form.Controls中。这意味着原始超链接不会消失 - 它仍然被引用。

接下来,为什么原始的仍然显示,而不是新的?那么,当页面呈现时,它主要关心Page.Form.Controls中存在的内容。由于原始引用仍然在page.form.controls中,因此将呈现该内容。新的超链接存在时,新的超链接从未添加到Page.Form.Controls。它只是由你的指针引用和操纵。除非你将它添加到Page.Form.Controls(或手动覆盖渲染/其他奇怪的东西),否则它不会显示。

6

你并不需要创建一个新的控件,只需使用一个你dec LARED。 你也没有使用正确的属性。

与此背后替换代码:

myHyperLink.NavigateUrl = "http://url.com"; 

我不相信你可以重写怎么样,你提到的控制,我认为这是通过父控件的控件集合添加或移除控制的情况下, 。

也就是说,

<form id="form1" runat="server"> 
<div> 
    <asp:HyperLink ID="HyperLink1" runat="server">HyperLink</asp:HyperLink> 
</div> 
</form> 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     HyperLink newHyperLink = new HyperLink(); 
     newHyperLink.NavigateUrl = "http://google.com"; 
     newHyperLink.Text = "Hello World"; 
     Page.Form.Controls.Remove(HyperLink1); 
     Page.Form.Controls.Add(newHyperLink); 
    } 
+0

真的,我可以这样做的,但我更感兴趣的是,为什么它不以这种方式工作。似乎这两种方法应该工作? – ChrisHDog 2010-07-08 00:29:59

+0

它确实有效,但是如上所述以一种迂回的方式。我从来没有像你的问题那样直接设置控件 - 因为控件已经创建,效率不高。 – 2010-07-08 00:51:29

+0

不会只是在页面底部添加新的超链接吗? (在你的例子中只有一个超链接,但超链接可能被其他项包围) – ChrisHDog 2010-07-08 00:52:17

2

在页面生命周期,它将实例ASPX页面上的控制变量,并将它们添加到收藏Page.Controls。当它呈现页面时,它会呈现Page.Controls集合中的每个子控件。

您正在做的是重新分配用于分配给生命周期实例化控件的变量,但现在分配给您的用户实例化控件,但原始控件仍存在于Page.Controls集合中,并且你不再有参考。

你需要做的是从Page.Controls中删除旧的控件,实例化你的新控件并将它添加到Page.Controls集合中,与旧的控件相同。

但是,我不会推荐这样做。有可能有更好的方式来做你想要达到的目标,但这就是为什么它不起作用。

+2

请注意1)大多数控件的内部都有一个Controls属性。您可以创建一个占位符并向该占位符添加任意数量的超链接2)您必须密切关注状态并确保它们在应该被添加时3)虽然可以通过foo x = new foo()创建默认控件,如果你有一个ascx页面,你应该说foo x = LoadControl(“〜/ Controls/Foo.ascx”),否则页面将无法正常加载4)一定要给Control集合添加一切ID – diadem 2010-07-08 16:23:59

0

你可以试试这个太:

Hyperlink HL1 = new Hyperlink(); 
HL1.Text = "Hyperlink"; 
HL1.TabIndex = 1; 
HL1.AccessKey = "w"; 
HL1.NavigateUrl = "http://stackoverflow.com/"; 
相关问题