Когда ViewPage начинает выполняться, он предполагает определенные вещи относительно оставшейся части запроса. Особенность, которая сбивает вас с толку, заключается в том, что ViewPage предполагает, что оставшаяся часть запроса будет обычным HTML или каким-либо другим текстовым ответом, поэтому он переключает TextWriter ответа со своим собственным средством записи.
В вашем случае вы должны создать новый производный от ActionResult класс, метод ExecuteResult которого инкапсулирует логику в вашем методе Page_Load. Ваш метод действия должен возвращать экземпляр вашего пользовательского класса, и вызывающий будет запускать метод ExecuteResult в соответствующее время. Это полностью обходит механизмы представления, что предотвращает ошибку, с которой вы работаете, и дает небольшое повышение производительности.