Мне кажется, я понимаю, что вы хотите сделать, но я боюсь, что это может быть невозможно. Когда ваша страница ASP.NET выполняет обратную передачу, на сервере создается новый поток для обработки запроса. Еще до того, как жизненный цикл вашей страницы успевает начаться, обнаруживается нарушающий XSS и выдается исключение. После создания этого исключения вы «изгоняетесь» из жизненного цикла страницы ASP.NET, и вы не можете повторно войти в него. На данный момент единственное, что вы можете сделать на стороне клиента, это вывести ошибку или перенаправить на страницу ошибки.
То, что вы хотите сделать, это перехватить исключение, записать его где-нибудь на странице и продолжить жизненный цикл страницы ASP.NET (т. Е. Восстановить дерево элементов управления, восстановить представление состояния, вызвать обработчики событий и т. Д.). Проблема заключается в том, что после возникновения необработанного исключения у вас больше нет доступа к жизненному циклу страницы ASP.NET. В этом конкретном случае некуда поставить блок try / catch, потому что внутреннее исключение выдается из жизненного цикла ASP.NET до вызова вашего собственного кода.
Я знаю, что вы сказали, что не хотите полагаться на Javascript, но в этом случае я думаю, что использование Javascript - единственный способ получить желаемое поведение. Вы все еще можете сохранить проверку на стороне сервера, на случай, если ваши пользователи отключат Javascript или введут какой-то ввод, который не обрабатывается вашим Javascript.