Событие Page_PreLoad () запускается перед событием нажатия кнопки ссылки, когда я нажимаю кнопку ссылки - PullRequest
0 голосов
/ 14 июля 2020

Я перечисляю папки и файлы на диске E, я использую скрытое поле, чтобы сохранить путь, я создал несколько кнопок ссылок, представляющих папки, они создаются программно в событии Page_PreLoad ():

    protected void Page_PreLoad(object sender, EventArgs e)
    {
        if (!string.IsNullOrEmpty(hdfPath.Value))
        {
            path = "E:\\" + hdfPath.Value;
            directories = Directory.GetDirectories(path);
            files = Directory.GetFiles(path);
        }
        else
        {
            directories = Directory.GetDirectories("E:\\");
            files = Directory.GetFiles("E:\\");
        }
        for (int i = 0; i < directories.Length; i++)
        {
           LinkButton lkbLink = new LinkButton();
           lkbLink.Click += new EventHandler(btn_Click);
           void btn_Click(object sender, EventArgs e)
           {
              if (string.IsNullOrEmpty(hdfPath.Value))
                hdfPath.Value = folderName;
              else
                hdfPath.Value += "\\" + folderName;
           }
        }
    }

Когда я нажимаю любую кнопку ссылки, сначала запускается событие Page_PreLoad (), затем событие btn_Click (), хотя я ожидал, что сначала будет запущена btn_Click (). В этом случае соответствующее значение в скрытом поле принадлежит значению предыдущего шага.

Что-то не так с выбранным мной жизненным циклом ASP. Net?

Как я могу заставить его немедленно установить значение скрытого поля, когда пользователь нажимает кнопку ссылки, чтобы было взято (правильное) текущее значение в скрытом поле?

1 Ответ

2 голосов
/ 14 июля 2020

В жизненном цикле нет ничего плохого и выбрать жизненный цикл тоже нельзя :) PreLoad-Event страницы всегда предшествует контрольным событиям. Этот даст вам подробный обзор жизненного цикла в asp. net.

Это немного сложно в вашем случае:

  1. вам нужно для динамического добавления некоторых кнопок и присоединения к ним обработчиков событий - это нужно делать при каждой обратной передаче, иначе обработчики кнопок не будут срабатывать.
  2. Затем в вашем обработчике вам нужно удалить их перед добавленными кнопками снова и добавьте новые в соответствии с новым путем.

Для этого создайте метод из своего кода, например:

    private void InitButtons()
    {
        if (!string.IsNullOrEmpty(hdfPath.Value))
        {
            path = "E:\\" + hdfPath.Value;
            directories = Directory.GetDirectories(path);
            files = Directory.GetFiles(path);
        }
        else
        {
            directories = Directory.GetDirectories("E:\\");
            files = Directory.GetFiles("E:\\");
        }
        for (int i = 0; i < directories.Length; i++)
        {
           LinkButton lkbLink = new LinkButton();
           lkbLink.Click += new EventHandler(btn_Click);
           void btn_Click(object sender, EventArgs e)
           {
              if (string.IsNullOrEmpty(hdfPath.Value))
                hdfPath.Value = folderName;
              else
                hdfPath.Value += "\\" + folderName;
              // remove the old buttons here, if you need to
              // RemoveOldButtons();
              // call the Init-Buttons-Function again
              InitButtons();
           }
        }
    }

Вызовите этот метод из события кнопки -handlers, как показано выше и снова в обработчике события загрузки:

    protected void Page_PreLoad(object sender, EventArgs e)
    {
        InitButtons();
    }
...