Есть ли способ запустить метод при загрузке сайта, но не при его отправке сообщений (asp.net + vb.net)

Метод с использованием Handles MyBase.Load Я пытаюсь заполнить раскрывающийся список всем временем суток с интервалом в 30 минут, вместо того, чтобы жестко его кодировать, я создал цикл, который создает и добавляет в раскрывающиеся списки . Я застрял на том, как сделать так, чтобы он запускался только один раз при первой загрузке страницы.

Единственное, что я нашел в других сообщениях, это сделать так, чтобы оно запускало событие. Я видел, как люди предлагали добавить Handles MyBase.Load, но это также добавляет дубликаты в существующие раскрывающиеся списки, когда другая часть страницы публикует ответ.

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

Вы просто ищете If Not IsPostBack в обработчике событий загрузки страницы?

David 10.07.2024 20:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Page.IsPostBack будет иметь значение true, когда кто-то отправит страницу. Проверить это можно в методе Load/Page_Load. Загрузка страницы будет срабатывать каждый раз, когда запрашивается страница.

Если вы хотите загружать данные только раз в 30 минут, добавьте пару свойств и определите их как «Общие». Один для DateTime для записи времени загрузки данных, а второй для хранения данных.

Значение в общих или статических свойствах доступно для всех сеансов, и, добавив код при загрузке страницы, который проверяет DateTime и, если он слишком старый, затем обновляет общее свойство, вы можете добиться того, что вы описываете.

Ответ принят как подходящий

Ну, конечно, нет смысла пытаться загружать такие данные при первом запуске всего веб-сайта.

Что касается простой обратной публикации на странице?

Последние 200+ веб-страниц, которые я создал, ВСЕ ИМЕЮТ стандартную заглушку кода IsPostBack в событии загрузки страницы. Фактически, вы даже не сможете создать работающую веб-страницу, если не примете использование такой заглушки кода.

Помните, что в отличие от настольного компьютера, при любом ответном сообщении, при любом нажатии кнопки сначала каждый раз запускается событие загрузки страницы, а ЗАТЕМ срабатывает ваш код заглушки для кнопки.

К счастью, у нас есть флаг IsPostBack, который позволяет проверить, действительно ли это первая загрузка страницы.

Итак, скажем, мне нужно в раскрывающемся списке выбрать время начала и окончания сегодняшнего дня, и, следовательно, у нас может быть такая разметка:

        <div style = "float: left">
            <h4>Select Start Time</h4>
            <asp:DropDownList ID = "cboStart" runat = "server"
                DataValueField = "Date"
                DataTextField = "TimeDisplay">
            </asp:DropDownList>
        </div>

        <div style = "float: left;margin-left:35px">
            <h4>Select End Time</h4>
            <asp:DropDownList ID = "cboEnd" runat = "server"
                DataValueField = "Date"
                DataTextField = "TimeDisplay">
            </asp:DropDownList>
        </div>

        <div style = "clear:both"></div>
        <br />
        <asp:Button ID = "cmdShow" runat = "server" Text = "Show Selected time"
            CssClass = "btn"
            OnClick = "cmdShow_Click"/>
        <br />
        <br />

        <asp:Label ID = "lblShowSelected" runat = "server" Text = "">
        </asp:Label>

А для простоты кодирования на дисплее будет отображаться только время, но выбор значений будет включать дату + время, и это, конечно, делает код менее сложным, поскольку мы всегда имеем дело с допустимой датой и временем, и, таким образом, выбор может быть например, используется для базы данных.

И код такой:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not IsPostBack Then
        LoadCbo
    End If
End Sub

Sub LoadCbo()

    Dim dtTimes As New DataTable
    dtTimes.Columns.Add("Date", GetType(DateTime))
    dtTimes.Columns.Add("TimeDisplay", GetType(String))

    Dim dtStartDay = Date.Today
    Dim dtStartTime = TimeSerial(9, 0, 0) ' start at 9 am

    Do
        Dim NewRow = dtTimes.NewRow()
        NewRow("Date") = dtStartDay.Add(dtStartTime.TimeOfDay)
        NewRow("TimeDisplay") = dtStartTime.ToString("hh:mm tt")
        dtTimes.Rows.Add(NewRow)

        dtStartTime = dtStartTime.AddMinutes(30)

    Loop While Hour(dtStartTime) <= 17 ' go untill 5 pm

    cboStart.DataSource = dtTimes
    cboStart.DataBind()
    cboStart.Items.Insert(0, "Select start Time")

    cboEnd.DataSource = dtTimes
    cboEnd.DataBind()
    cboEnd.Items.Insert(0, "Select End Time")


End Sub

Protected Sub cmdShow_Click(sender As Object, e As EventArgs)

    Dim dtStart As DateTime = cboStart.SelectedItem.Value
    Dim dtEnd As DateTime = cboEnd.SelectedItem.Value


    Dim sMsg As String =
        $"Selected Time for {dtStart.ToString("dddd MMMM dd, yyyy")} Is <br/>
        {dtStart.ToString("hh:mm tt")} to {dtEnd.ToString("hh:mm tt")}"

    lblShowSelected.Text = sMsg

End Sub

Выше мы загружаем поля со списком с шагом в 30 минут, но вы можете изменить это на все, что пожелаете.

Обратите внимание на важный тест IsPostBack. Это означает, что код настройки для загрузки элементов управления и общий код настройки страницы запускаются только один раз при первой реальной загрузке страницы. Хотя для каждого нажатия кнопки и т. д. (обратная связь) сначала запускается событие загрузки страницы, а затем ваш код заглушки нажатия кнопки?

Это не имеет значения, поскольку наш «настоящий» код загрузки первой страницы находится внутри нашего теста IsPostBack и, следовательно, будет запускаться только один раз при первой загрузке страницы.

Результат вышеизложенного таков:

Следовательно, теперь мы можем иметь события нажатия кнопок и т. д., и поэтому они не будут влиять на код, который загружает элементы управления, такие как DropDownList (поле со списком) в этом примере.

Другие вопросы по теме

Похожие вопросы