Это проще, чем вы делаете. Создайте страницу с именем error.aspx (или как вы хотите ее называть) и включите CustomErrors в web.config.
<configuration>
<system.web>
<customErrors defaultRedirect="errors.aspx"
mode="On">
</customErrors>
</system.web>
</configuration>
Существует множество конфигураций для обработки различных ошибок http или случайных исключений. Если вы хотите, вы можете сбросить сообщение об исключении (или само исключение) в сеанс или использовать HttpServerUtility.GetLastError
( документация ), а затем вывести любое количество различных сообщений на странице ошибок. Это даже поймает исключения, которые вы не поймаете.
Документация по пользовательским ошибкам
Редактировать:
@Icarus указывает, что OP ищет решение, с помощью которого страница продолжает отображаться и выводиться, показывая только сообщение об ошибке на странице, поэтому я также предоставлю ответ.
Есть несколько способов, которыми я справился с этим в прошлом. Для очень сложных страниц, где запрашиваемое поведение является фатальным (результат страницы не может быть известен), я всегда ссылаюсь на страницу с ошибкой, как я упоминал выше, которая включает основные главные элементы. Таким образом, меню, заголовок и т. Д. Все еще там, но уведомление о катаклизме очевидно.
Поведение, которое вы, похоже, ищете, я бы использовал не столько из-за необходимости сообщать об исключениях, сколько из общих сообщений. Я предпочитаю, чтобы пользовательский элемент управления имел общедоступное свойство, в которое можно вставить сообщение. Например (простите за VB, я не могу найти свою версию C #):
<BrowsableAttribute(True), Bindable(False), Category("Misc"), _
Description("Gets or sets the NavigateUrl property for the link to start a new request.")> _
Public Property MyImportantMessage() As String
Get
Return _myImportantMessage
End Get
Set(ByVal value As String)
_myImportantMessage= value
End Set
End Property
Тогда выводом может быть любое понравившееся вам строковое сообщение, или вы можете запрограммировать несколько пресетов, извлекать из ресурсов и так далее. Что касается того, как туда попасть, мы выбрали маршрут MasterPage. У нас на главных страницах есть метод, который назначает такое свойство непосредственно в пользовательском элементе управления. Чтобы этот метод мог вызываться, каждая страница, использующая главную страницу, должна включать свойство VirtualPath, иначе метод не будет доступен во время компиляции.
<%@ MasterType
VirtualPath="~/MasterPage.master" %>
Это позволяет затем вызывать свойство Master
на самой странице для вызова этого свойства:
'Keeping the VB theme
Me.Master.SetImportantMessage(message)
Имейте в виду, что Me.Master
изнутри страницы не совпадает с Page.Master
. Таким образом, ваше исключение либо должно всплыть на фактической странице, либо сама ссылка на страницу должна быть отправлена в ваш пользовательский контроль как свойство.