是否可以从Code Behind设置新的asp超链接

时间:2010-07-08 00:05:23

标签: c# asp.net

我想知道是否有可能在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;

4 个答案:

答案 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/";