Я считаю, что это известное ограничение asp.net для использования свойства AutoPostBack="true"
в раскрывающихся списках. Свойство AutoPostBack
отменяет процесс проверки и отправляет обратно.
В качестве простого обходного пути вы можете вызвать проверку во время обратной передачи, изменив событие загрузки страницы:
protected void Page_Load(object sender, EventArgs e)
{
if(Page.IsPostBack)
Page.Validate();
}
Это приведет к тому, что проверка будет по-прежнему выполняться после ситуации AutoPostBack
. Если значения раскрывающегося списка неверны, страница обновится с сообщениями об ошибках, отображаемыми как ожидалось. Недостатком является то, что экран будет мерцать и т. Д., Но на самом деле единственным вариантом является добавление пользовательских сценариев проверки на стороне клиента к каждому DropDownList
элементу управления, который лично я не думаю, что он того стоит.
С помощью приведенного выше кода помните, что когда страница автоматически отправляется обратно, она на самом деле может быть недействительной - однако другие методы, которые вы, возможно, вызвали, могут ожидать допустимой страницы. Используйте свойство Page.IsValid
для защиты от этого. (Использование Page.IsValid
на самом деле является наилучшей практикой для проверенных форм.)
Пример:
protected void Page_Load(object sender, EventArgs e)
{
if(Page.IsPostBack)
Page.Validate();
ddlMod.SelectedIndexChanged += new EventHandler(ddlMod_SelectedIndexChanged);
if(Page.IsValid)
{
//load some data; do some things...
}
}
protected void ddlMod_SelectedIndexChanged(object sender, EventArgs e)
{
if(Page.IsValid)
{
//do some stuff if the page validated
}
}
Последнее замечание - вам нужно убедиться, что Page.Validate()
вызывается на раннем этапе жизненного цикла страницы (Page_Load
- хороший момент), как если бы вы ссылались на Page.IsValid
и Validate()
еще не был вызван, Page.IsValid
с большим неприятным исключением ...
Если вы хотите избавиться от мерцания при автоматической обратной передаче, вы также можете использовать ajax UpdatePanel
, чтобы все было легко для пользователя.
Надеюсь, это поможет!