Чтобы ответить на вопрос, почему это происходит: в основном каждый раз, когда сервер обрабатывает запрос от браузера для этой страницы, платформа ASP.NET создает новый экземпляр вашего UpdateChild
класса.
В вашем сценарии происходит 2 отдельных запроса: один, когда страница загружается в первый раз, и другой, когда пользователь нажимает кнопку.
Во время первого запроса, поскольку запрос не является обратной передачей, класс UpdateChild
присваивает значение переменной UserName
. Тем не менее, поскольку этот экземпляр UpdateChild
будет отброшен после завершения обработки запроса, значение, присвоенное этой переменной, будет потеряно. Если вы хотите сохранить это значение, вам нужно будет сохранить его на странице, отличном от переменной уровня класса. Наиболее логичным местом, вероятно, будет либо ViewState, либо Session.
Простое решение вашей проблемы - изменить объявление UserName
на что-то вроде следующего:
string UserName
{
get { return ViewState["UserName"] as string; }
set { ViewState["UserName"] = value; }
}