2010-07-08 3 views
2

Мне интересно, возможно ли иметь гиперссылку asp на странице aspx и в коде, установленном в новой ссылке в разделе Page_Load. Я пробовал это и, похоже, не работает, но хотел узнать больше о механике (это то, что просто не работает или может работать раньше в жизненном цикле страницы или почему это не работает).Можно ли установить новую ссылку asp Hyperlink из Code Behind

Пример кода

Aspx Page

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

Код За

var newHyperLink = new HyperLink(); 
newHyperLink.NavigateUrl= url; 
newHyperLink.Text = "Hello World"; 
myHyperLink = newHyperLink; 

ответ

0

У .NET есть сборщик мусора, который заботится о его очистке кода. Вот почему вам не нужны (вообще) деструкторы.

В этом случае важно, чтобы что-то «уходило», когда ничего не ссылается на него.

Что также имеет значение, что представляет собой myHyperLink. myHyperLink - это не сам объект, это указатель . Существуют определенные базовые типы, такие как int, где это не так, но когда вы имеете дело со сложными объектами, это то, что происходит. Таким образом, в этом случае у вас есть указатель myHyperLink и объект, на который указывает myHyperLink. Это различие очень важно.

В вашем коде есть гиперссылка и указатель myHyperLink. На сам объект гиперссылки ссылаются обе страницы.Элементы управления и - ваша локальная ссылка на myHyperLink.

Когда вы сказали

myHyperLink = newHyperLink;

Что вы делали, так это изменение, на которое указывал указатель myHyperLink. Исходная гиперссылка все еще существовала в Page.Form.Controls. Это означает, что оригинальная гиперссылка не исчезает - на нее все еще ссылаются.

Далее, почему оригинальная модель все еще отображается, а не новая? Ну, когда страница делает это, в основном заботится о том, что существует в Page.Form.Controls. Поскольку исходная ссылка все еще находится в файле page.form.controls, это то, что получается. В то время как новая гиперссылка существует, новая гиперссылка никогда не добавлялась в Page.Form.Controls. Это было просто опровергнуто вашим указателем и манипулировало. Если вы не добавите его в Page.Form.Controls (или переопределите рендеринг вручную/какую-то другую странную вещь), он не будет отображаться.

6

Вам не нужно, чтобы создать новый элемент управления, просто использовать один вы де 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

+0

Он работает, но круговым способом, как упоминалось выше. Я никогда не устанавливал контроль прямо как в вашем вопросе - поскольку элемент управления уже создан, он не очень эффективен. –

+0

не может добавить новую гиперссылку в нижней части страницы? (в вашем примере есть только одна гиперссылка, но потенциально гиперссылка может быть окружена другими элементами) – ChrisHDog

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) обязательно добавьте все элементы коллекции управления ID – diadem

0

Вы можете попробовать это тоже:

Hyperlink HL1 = new Hyperlink(); 
HL1.Text = "Hyperlink"; 
HL1.TabIndex = 1; 
HL1.AccessKey = "w"; 
HL1.NavigateUrl = "http://stackoverflow.com/"; 
Смежные вопросы