Хотя, возможно, это не самый правильный способ справиться с ситуацией, которую я создал для себя, пытаясь скопировать поток и стиль нашего продукта Windows для Интернета, я нашел способ решить проблему событий. не запускается из этого элемента управления, когда отображается в модальном всплывающем окне; хотя окольным путем.
Сначала я написал функцию в javascript, функция выполняет большую часть математики, которую я бы поместил в события элемента управления; по сути, он рассчитывает количество учебного времени, оставшегося между настоящим моментом и конкретной датой, с учетом дней недели, которые пользователь выбрал в качестве учебных дней. Затем я передаю информацию, которую я сохраняю, в базу данных с помощью веб-метода.
function calculateStudyTime() {
//do some math
…
PageMethods.SaveModalExamDateChangesToDB(datesString, selectedDate);
}
Я прикрепляю скрипт к каждому из элементов управления, которые я хочу запустить в своем коде. В моем случае я хочу пересчитать время обучения, когда когда-либо один из флажков, обозначающих день недели, будет переключен. Поэтому я прикрепил скрипт к элементам управления ListItem. Я сделал это так, потому что элемент управления ListItem на самом деле не имеет атрибута onclick, доступного через конструктор, но его можно добавить таким образом.
protected void LoadCalendar(object sender, EventArgs e)
{
…
foreach (ListItem item in WeekCheckBox.Items)
{
item.Attributes.Add("onclick", "calculateStudyTime()");
}
…
}
Наконец, на базовой странице, с которой вызываются все модальные всплывающие окна, я создаю статическую ссылку на эту базовую страницу и на украшенную функцию, вызываемую из файла javascript. Статическая ссылка на себя необходима, чтобы я мог получить доступ к элементам базовой страницы (в данном случае к моему контексту) из статического веб-метода.
Static Dashboard thisPage;
protected void Page_Load(object sender, EventArgs e)
{
…
thisref = this;
…
}
[WebMethod]
[ScriptMethod]
public static void SaveModalExamDateChangesToDB(string days, string date)
{
thisPage.UserSession.UserCourse.ExamDate = DateTime.Parse(date);
thisPage.UserSession.UserCourse.StudyDays = days;
thisPage.UserSession.UserCourse.Save();
}
Как я уже сказал, это не идеально, но работает.