При установке свойства только для чтения, asp.net знает, что вы пометили контроль как неизменяемые и изменяет способ управления ведет себя - это добавить атрибут только для чтения HTML к визуализированному управлению и не будет вход процесса при обратной передаче. Когда вы делаете это с помощью атрибутов, .net просто рассматривает его как атрибут, нет специальной логики, что заставляет .net «работать», что добавленный вами атрибут означает, что должен изменить свойство элемента управления. В основном
txtdate.Attributes.Add("readonly", 'true');
ничем не отличается в .net, чем
txtdate.Attributes.Add("ABC", 'DEF');
Ваш код атрибута добавляет «только для чтения» атрибут так он ведет себя как вы ожидали бы на странице, но как .net ReadOnly свойство не установлено , .net не изменяет поведение элемента управления при обратной передаче.
Аналогичная ситуация происходит с текстовым полем, установленным в режим «Пароль». Вы можете установить что угодно, используя .Text, но текстовое поле не будет отображать значение , так как .net изменяет способ управления, когда его режим установлен на Пароль. Вы можете обойти это, добавив атрибут «значение» в таким образом, и установите «значение» в качестве пароля.