C# 是否可以从代码隐藏设置新的asp超链接

C# 是否可以从代码隐藏设置新的asp超链接,c#,asp.net,C#,Asp.net,我想知道是否有可能在aspx页面上有一个asp超链接,并在代码隐藏中将其设置为页面加载部分的新超链接。我尝试过这个方法,但它似乎不起作用,但我想了解更多有关机制的信息(这是不起作用的,还是可能在页面生命周期的早期起作用,或者为什么不起作用) 示例代码 Aspx页面 您不需要创建新控件,只需使用您声明的控件即可。 您也没有使用正确的属性 将代码替换为以下内容: myHyperLink.NavigateUrl = "http://url.com"; 我不相信您可以像您提到的那样重写控件,我认为这是

我想知道是否有可能在aspx页面上有一个asp超链接,并在代码隐藏中将其设置为页面加载部分的新超链接。我尝试过这个方法,但它似乎不起作用,但我想了解更多有关机制的信息(这是不起作用的,还是可能在页面生命周期的早期起作用,或者为什么不起作用)

示例代码

Aspx页面


您不需要创建新控件,只需使用您声明的控件即可。 您也没有使用正确的属性

将代码替换为以下内容:

myHyperLink.NavigateUrl = "http://url.com";
我不相信您可以像您提到的那样重写控件,我认为这是通过父控件的控件集合添加或删除控件的情况


超链接
受保护的无效页面加载(对象发送方、事件参数e)
{
HyperLink newHyperLink=新超链接();
newHyperLink.NavigateUrl=”http://google.com";
newHyperLink.Text=“你好世界”;
Page.Form.Controls.Remove(HyperLink1);
Page.Form.Controls.Add(newHyperLink);
}

在页面生命周期中,它将为ASPX页面上的控件实例化变量,并将它们添加到page.controls集合中。当它呈现页面时,它呈现页面中的每个子控件。控件集合

您所做的是重新分配以前分配给生命周期实例化控件但现在分配给用户实例化控件的变量,但是,原始控件仍存在于Page.Controls集合中,您不再有对它的引用

您需要做的是从Page.Controls中删除旧控件,实例化新控件并将其添加到Page.Controls集合中的旧控件


但是,我不建议这样做。可能有更好的方法来完成您试图实现的目标,但这就是它不起作用的原因。

.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(或覆盖手动渲染/其他奇怪的事情),否则它不会显示。

您也可以尝试以下方法:

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

没错,我可以这样做,但我更感兴趣的是为什么它不能这样工作。似乎这两种方法都应该有效?它确实有效,但如上所述是一种迂回的方式。我从来没有像你的问题中那样直接设置控件-因为控件已经创建,所以效率不高。这不就是在页面底部添加新的超链接吗?(在您的示例中,只有一个超链接,但该超链接可能被其他项目包围)是的,这是因为在上面的示例中,我将其添加到表单控件集合中。如果您想在其他地方使用它,那么您可以将它添加到它前面的控件中。请注意1)大多数控件内部都有controls属性。您可以创建一个占位符并向该占位符添加任意数量的超链接2)您必须关注状态并确保它们在应该添加的时候被添加3)而默认控件可以由foo x=new foo()创建如果您有一个ascx页面,您应该说foo x=LoadControl(~/controls/foo.ascx”)或者页面无法正确加载4)请确保为添加到控件集合的所有内容提供ID
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);
    }
Hyperlink HL1 = new Hyperlink();
HL1.Text = "Hyperlink";
HL1.TabIndex = 1;
HL1.AccessKey = "w";
HL1.NavigateUrl = "http://stackoverflow.com/";