Самый идиоматический способ сделать это должно использовать символы. Например, вместо:
enum {
FOO,
BAR,
BAZ
}
myFunc(FOO);
... можно просто использовать символы:
# You don't actually need to declare these, of course--this is
# just to show you what symbols look like.
:foo
:bar
:baz
my_func(:foo)
Это более открыто, чем перечисления, но это соответствует хорошо духу Ruby.
Символы также работают очень хорошо. Сравнение двух символов для равенства, например, намного быстрее, чем сравнение двух строк.
Я считаю, что поведение, которое вы видите, правильное. Response.redirect выполняется через браузер. Поэтому, когда вы получаете сообщение об ошибке, страница отправляется в браузер, и браузер запускает перенаправление. Перенаправление вызывает повторное срабатывание page_load (это стандартный поток в ASP.NET).
Хотя вы можете использовать Server.Transfer, чтобы обойти это, я бы рекомендовал использовать перенаправление ошибок, встроенное в ASP.NET. См. на этой странице для получения дополнительной информации о том, что доступно и как их использовать.
Попробуйте следующее:
Response.Redirect("url");
Response.End;