我想知道是否有可能在aspx页面上有一个asp超链接,并且在后面的代码中将其设置为Page_Load部分中的新超链接。我试过这个,看起来不行,但想知道更多关于这个机制的东西(这是不是工作,或者可以在页面生命周期的早期工作,或者为什么它不工作)。是否有可能从代码背后设置一个新的ASP超链接
示例代码
ASPX页面
<asp:HyperLink ID="myHyperLink" runat="server" />
代码隐藏
我想知道是否有可能在aspx页面上有一个asp超链接,并且在后面的代码中将其设置为Page_Load部分中的新超链接。我试过这个,看起来不行,但想知道更多关于这个机制的东西(这是不是工作,或者可以在页面生命周期的早期工作,或者为什么它不工作)。是否有可能从代码背后设置一个新的ASP超链接
示例代码
ASPX页面
<asp:HyperLink ID="myHyperLink" runat="server" />
代码隐藏
.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(或手动覆盖渲染/其他奇怪的东西),否则它不会显示。
你并不需要创建一个新的控件,只需使用一个你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);
}
在页面生命周期,它将实例ASPX页面上的控制变量,并将它们添加到收藏Page.Controls。当它呈现页面时,它会呈现Page.Controls集合中的每个子控件。
您正在做的是重新分配用于分配给生命周期实例化控件的变量,但现在分配给您的用户实例化控件,但原始控件仍存在于Page.Controls集合中,并且你不再有参考。
你需要做的是从Page.Controls中删除旧的控件,实例化你的新控件并将它添加到Page.Controls集合中,与旧的控件相同。
但是,我不会推荐这样做。有可能有更好的方式来做你想要达到的目标,但这就是为什么它不起作用。
请注意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
你可以试试这个太:
Hyperlink HL1 = new Hyperlink();
HL1.Text = "Hyperlink";
HL1.TabIndex = 1;
HL1.AccessKey = "w";
HL1.NavigateUrl = "http://stackoverflow.com/";
真的,我可以这样做的,但我更感兴趣的是,为什么它不以这种方式工作。似乎这两种方法应该工作? – ChrisHDog 2010-07-08 00:29:59
它确实有效,但是如上所述以一种迂回的方式。我从来没有像你的问题那样直接设置控件 - 因为控件已经创建,效率不高。 – 2010-07-08 00:51:29
不会只是在页面底部添加新的超链接吗? (在你的例子中只有一个超链接,但超链接可能被其他项包围) – ChrisHDog 2010-07-08 00:52:17