2013-05-13 4 views
0

Привет всем

Это мой первый пост в 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
    LinkButton

  • reatta цин 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); 
    } 
+0

ТАК, вы используете VB.NET или C#? Когда вы добавляете свой контроль в дерево? –

+0

Когда ваша привязка 'Repeater'-instance? По каждому запросу или автоматической привязке, на которой выполняется жизненный цикл? Когда добавляется контроль? –

+0

@ bash.d: см. Мою первую пулю при настройке (VS 2008 C#, IIS 7) – 2013-05-13 12:58:17

ответ

2
var ctrlX = base.LoadControl("~/somedir/someucl.ascx"); 

Где именно делает этот код жить на вашей странице?

Вам необходимо убедиться, что вы создаете его и добавили его в коллекцию управления достаточно рано в жизненном цикле страницы, чтобы на последующих postbacks его созданный & был подключен вовремя. То есть в oninit случае.

protected override OnInit(...) 
{ 
    base.OnInit(...); 

    var ctrlX = base.LoadControl("~/somedir/someucl.ascx"); 

    this.Controls.Add(ctrlX); 
} 
+0

также, переплет, чтобы быть выполненным правильно ... и с использованием тех же идентификаторов снова ... и ... и ... правильный жизненный цикл - всего лишь одноразовый ... –

+0

согласован ... но это тот, который я нахожу чаще всего укусами людей с помощью экземпляра Dynamic Control ... если ничего другого (так как его кнопка ссылки находится внутри элемента управления, и событие объявлено на этой ссылке), это хорошее начальное место для проверки. @DarthVader - разместите больше кода, чтобы мы могли видеть, что происходит с ним, код ваших страниц за –

+0

пользовательский элемент управления загружается в событие загрузки страницы страницы, которое запускается перед событием загрузки страницы ucl (это еще слишком поздно?); в обоих случаях ucl init и load кнопки присутствуют при обратной передаче; Идентификаторы кнопок всегда одинаковы, и, как сказано, я проверил их по обратной передаче, и они не меняют – 2013-05-13 12:55:12

Смежные вопросы