Привет всем
Это мой первый пост в stackoverflow (который, кстати, мой любимый сайт для поиска ответов). После окончательного признания поражения, я надеюсь, что кто-то может мне помочь с этой проблемой ...LinkButton postback, но клик не был запущен
Вопрос уже задан несколько раз, но ни одно из предлагаемых нами решений не помогло. Извиняюсь заранее за длинный пост, но я хочу, чтобы никто не тратил свое время на то, что предлагал вещи, которые я уже пробовал.
Приведенный ниже код работал до недавнего времени, и его структура не была затронута с тех пор (хотя на дочернюю страницу были сделаны несвязанные изменения). В любом случае он внезапно прекратил работать. Теперь даже самая упрощенная кнопка не срабатывает.
Настройка
- VS 2008 C#, не IIS 7 (никаких изменений в настройках, так как путь, прежде чем он перестал работать)
- вложенную MasterPage (основной + 1 ребенок)
- динамически загруженный ucl с datalist в дочерней странице
(т.е. MP => вложенный MP => дочерняя страница => ucl => datalist => li nkbutton) - LinkButton нажмите событие также находится в UCL
Проблема
На LB щелчком, постбэк нормально, но событие щелчка на стороне сервера никогда не получает удар.
Код
страница:
var ctrlX = base.LoadControl("~/somedir/someucl.ascx");
=> loads fine
ASCX файл (DataList лишен всех, кроме кнопки):
<asp:DataList ID="dlX" RepeatLayout="Table" runat="server">
<HeaderTemplate></HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<asp:LinkButton ID="btnX" OnClick="btnX_Click" CausesValidation="false" runat="server" />
</td>
</tr>
</ItemTemplate>
<FooterTemplate></FooterTemplate>
отделенного код:
protected void btnX_Click(object sender, EventArgs e)
{
// do something
}
вещей пытались
- очистки раствора
выкапывания рабочей резервной копии и проверкой изменений кода
Не(найдено ни влияния на структуру или пользовательский элемент управления)настройки LinkButton CausesValidation истина/ложь
- зачистки DataList и LinkButton вниз к самым необходимым
- добавляющих AddressOf = "btnX.click" к LinkButton
упаковка UpdatePanel поштучно с различными настройками вокруг
UserControl
DataList
LinkButtonreatta цин EventHandler в UserControl случае инициализации/нагрузки:
IEnumerable<Control> controls = Utils.FlattenChildren(dlX); foreach (var button in controls.OfType(LinkButton)()) { if (button.ID.Contains("btnX")) button.Click += new EventHandler(btnX_Click); }
Где бы я добавить выше код, все кнопки находятся и событие прилагается, но щелчок событие не срабатывает ((LinkButton) = LinkButton внутри <>; не смог заставить его отображаться правильно, все еще немного борясь с редактором) .
добавление PostBackUrl вручную страницы случае нагрузки
- сравнения клиента идентификаторами между нагрузкой/обратной передачи событий => они всегда совпадают
Вот и все. Прямо сейчас, я не могу придумать, что еще попробовать или проверить (может быть, что-то в контекстном меню точки останова при обратной передаче?).
Поскольку ucl загружается нормально, а postback работает нормально, я подозреваю, что проблема находится где-то в ucl, а не на дочерней странице, загружающей его. Но, возможно, нет.
Если возможно, я хочу избежать обходных путей (мне нужен параметр команды кнопки, не показан выше, и я не увлекаюсь такими решениями, как jquery со скрытым полем или строкой запроса).
Помимо всего прочего, я бы очень хотел понять, что вызывает это.
Очевидно, что мне что-то не хватает ... Благодаря тому, что кто-то не торопился читать или помогал с этим!
======== по просьбе дополнительного отделенного кода =======
я упростил код родительской страницы до минимума, опустившись все вызовы методов, а также на предложение Eoins переместилась загрузка ucl в событие init. Код ucl остается таким, как показано выше. DL и LB отображаются хорошо, и при щелчке запускается обратная передача, происходит событие загрузки страницы ucl, но по-прежнему событие нажатия на сервер не попадает.
protected override void OnInit(EventArgs e)
{
var ctrlX = base.LoadControl("~/someucl.ascx");
if (ctrlX == null)
return;
DataList dlX = (DataList)ctrlX.FindControl("dlX");
if (dlX == null)
return;
DummyCollection x = new DummyCollection();
x.Add(null); // ok since the test LB does not draw on the datasource
dlX.DataSource = x;
dlX.DataBind();
pnlX.Controls.Add(ctrlX);
base.OnInit(e);
}
ТАК, вы используете VB.NET или C#? Когда вы добавляете свой контроль в дерево? –
Когда ваша привязка 'Repeater'-instance? По каждому запросу или автоматической привязке, на которой выполняется жизненный цикл? Когда добавляется контроль? –
@ bash.d: см. Мою первую пулю при настройке (VS 2008 C#, IIS 7) – 2013-05-13 12:58:17