Вот подход, который на самом деле не рекомендуется, но мне было весело писать его, и он может привести вас к некоторым изумительным идеям!
(p.s. Я использую jQuery, чтобы облегчить жизнь)
Снимите Visible="false"
с панели asp: мы сделаем все это на стороне клиента.
<asp:Panel ID="errorPanel" runat="server" CssClass="error">
Теперь, когда документ готов, мы будем скрывать панель и связываться с проверочным кодом ASP.NET.
$(document).ready(function () {
// This is more like it!
$("#<% =errorPanel.ClientID %>").hide();
eval('ValidatorCommonOnSubmit = ' + ValidatorCommonOnSubmit.toString().replace('return result;', 'myValidatorHook(result); return result;'));
});
Этот eval принимает функцию ValidatorCommonOnSubmit()
, сгенерированную валидаторами ASP.NET, и модифицирует ее на месте, поэтому непосредственно перед возвратом своего результата он вызывает myValidatorHook()
с таким результатом.
(см. этот вопрос StackOverflow где я получил идею)
Теперь наш крючок:
function myValidatorHook(validated) {
if (validated) {
$("#<% =errorPanel.ClientID %>").hide();
}
else {
$("#<% =errorPanel.ClientID %>").show();
}
}
Достаточно просто - если валидатор вернул true (страница проверяется), скрыть панель; если он вернул false (страница не прошла проверку), покажите его.
Используйте на свой страх и риск! Если JavaScript, сгенерированный валидаторами ASP.NET, изменится, это ужасно сломается, но я протестировал его в ASP.NET 2.0, 3.5 и 4.0, и он работал одинаково во всех трех.