Внутреннее изображение и текст asp: LinkButton исчезает после обратной передачи

У меня есть кнопка ссылки:

<asp:LinkButton ID="LinkButtonPrint" runat="server" OnClick="OnPrint_Click">
     <img src="img/print-icon.png" alt="" />
     <asp:Literal runat="server" Text="<%$ Resources:PrintPage %>" />
</asp:LinkButton>

В коде позади я добавляю обработчик onclick в Page_Load следующим образом:

LinkButtonPrint.Attributes["onclick"] = "StartLoadTracking(this, '" + GetLocalResourceObject("Loading") + "')";

Представленный HTML выглядит следующим образом:

<a href="javascript:__doPostBack('ctl00$LinkButtonPrint','')" 
id="ctl00_LinkButtonPrint" onclick="StartLoadTracking(this, 'Loading...');">
    <img alt="" src="img/print-icon.png">Print page
</a>

Если я нажму на эту кнопку, он будет работать нормально (он ответит файлом PFD, поэтому HTML-код не будет отправлен обратно в браузер), но если я нажму кнопку другой на странице (что делает полный postback) LinkButtonPrint не будет иметь внутренний контент, он будет отображаться следующим образом:

<a href="javascript:__doPostBack('ctl00$LinkButtonPrint','')"  
id="ctl00_LinkButtonPrint" onclick="StartLoadTracking(this, 'Loading...');"></a>

Если я удаляю строку LinkButtonPrint.Attributes["onclick"] = ... из Page_Load, все работает нормально (за исключением того, что моя js-функция не вызывается, но это нормально).

Что мне здесь не хватает?

ИЗМЕНИТЬ
Это дубликат
Изображение кнопки asp.net Link не видно после обратной передачи
но этот не решается также: (

Ответы

Ответ 1

Я нашел решение:
Мне пришлось добавить runat="server" в тег <img> внутри <asp:LinkButton>:

<img src="img/print-icon.png" alt="" runat="server" />

Ответ 2

Эта проблема теперь известна Microsoft, и они опубликовали официальное выражение и обходное решение проблемы Microsoft Connect 718810: LinkButton контролирует сбор данных, потерянный при обратной передаче.

Оператор Microsoft:

Благодарим вас за отзыв. Это похоже на странность с тем фактом, что элемент управления LinkButton позволяет прямое текстовое содержимое через свойство Text или в разметке или субконтроллеры через коллекцию Control или разметку. Обходной путь заключается в использовании заполнителя в качестве корневого содержимого для управления и размещения там желаемого смешанного содержимого, например.

<asp:LinkButton runat="server">
    <asp:PlaceHolder runat="server">
        This is some text.</br>
        <asp:Label runat="server">This is a control</asp:Label>
    </asp:PlaceHolder>
</asp:LinkButton> 

Ответ 3

проблема заключается в том, что Атрибуты [ "onclick" ] = переопределяют обработчик операции onclick.

2 вещь, которую вы могли бы попробовать:

LinkButtonPrint.Attributes.Add("onclick", "StartLoadTracking(this, '" + GetLocalResourceObject("Loading") + "');");

или

LinkButtonPrint.Attributes["onclick"] = "StartLoadTracking(this, '" + GetLocalResourceObject("Loading") + "');" + LinkButtonPrint.Attributes["onclick"];

Ответ 4

Просто заметьте, чтобы добавить к решению выше.

Я обнаружил, что это происходит конкретно, когда у меня был enabled = false (чтобы показать отключенный стиль) мою ссылку, а затем вызвал обратную передачу с страницы с помощью другого элемента управления.

Компонент .Text элемента linkbutton был уничтожен после обратной передачи.

НО, поставив runat = "server" на теги .Text/html (em, span), они теперь сохраняются после обратной передачи.