我想知道是否有可能在aspx页面上有一个asp超链接,并在后面的代码中将它设置为Page_Load部分中的新超链接。我已经尝试了这个并且看起来不起作用,但是想要了解更多关于机制的知识(这是不起作用的,或者可以在页面生命周期的早期工作,或者为什么它不起作用)。< / p>
示例代码
Aspx Page
<asp:HyperLink ID="myHyperLink" runat="server" />
背后的代码
var newHyperLink = new HyperLink();
newHyperLink.NavigateUrl= url;
newHyperLink.Text = "Hello World";
myHyperLink = newHyperLink;
答案 0 :(得分:6)
您无需创建新控件,只需使用您声明的控件即可。 你也没有使用正确的财产。
用以下代码替换你的代码:
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);
}
答案 1 :(得分:2)
在页面生命周期中,它将为ASPX页面上的控件实例化变量,并将它们添加到Page.Controls集合中。当它呈现页面时,它会在Page.Controls集合中呈现每个子控件。
您正在做的是重新分配以前分配给生命周期实例化控件的变量,但现在已分配给您的用户实例化控件,但是,原始控件仍然存在于Page.Controls集合中,而您不再有参考。
您需要做的是从Page.Controls中删除旧控件,实例化您的新控件并将其添加到与旧版本相同的点上的Page.Controls集合。
然而,我不建议这样做。可能有更好的方法来做你想要达到的目标,但这就是为什么它不起作用。
答案 2 :(得分:0)
.NET有一个垃圾收集器来处理它的代码清理。这就是为什么你(通常)不需要析构函数。
在这种情况下相关的是,当没有任何东西引用时,某些东西会“消失”。
myHyperLink代表什么也是相关的。 myHyperLink不是对象本身,它是对象的指针。有一些基本类型,比如int不是这种情况,但是当你处理复杂的对象时,那就是正在发生的事情。因此,在这种情况下,您同时拥有myHyperLink指针和myHyperLink指向的对象。这种区别非常重要。
在您的代码中,我们有超链接本身和myHyperLink指针。超链接对象本身由Page.Form.Controls 和引用myHyperLink的本地引用。
当你说
时myHyperLink = newHyperLink;
你所做的是改变myHyperLink指针指向的内容。原始超链接仍然存在于Page.Form.Controls中。这意味着原始超链接不会消失 - 它仍然被引用。
接下来,为什么原始的仍然显示而不是新的?好吧,当页面呈现时,它主要关心Page.Form.Controls中存在的内容。由于原始引用仍然在page.form.controls中,因此呈现的内容。当新的超链接存在时,新的超链接从未添加到Page.Form.Controls。它被你的指针简单地引用并被操纵。除非你将它添加到Page.Form.Controls(或手动覆盖渲染/其他一些奇怪的东西),否则它将无法显示。
答案 3 :(得分:0)
你也可以试试这个:
Hyperlink HL1 = new Hyperlink();
HL1.Text = "Hyperlink";
HL1.TabIndex = 1;
HL1.AccessKey = "w";
HL1.NavigateUrl = "http://stackoverflow.com/";